flatcam/appWorkerStack.py

45 lines
1.4 KiB
Python

from PyQt5 import QtCore
from appWorker import Worker
import multiprocessing
class WorkerStack(QtCore.QObject):
worker_task = QtCore.pyqtSignal(dict) # 'worker_name', 'func', 'params'
thread_exception = QtCore.pyqtSignal(object)
def __init__(self, workers_number):
super(WorkerStack, self).__init__()
self.workers = []
self.threads = []
self.load = {} # {'worker_name': tasks_count}
# Create workers crew
for i in range(0, workers_number):
worker = Worker(self, 'Slogger-' + str(i))
thread = QtCore.QThread()
worker.moveToThread(thread)
# worker.connect(thread, QtCore.SIGNAL("started()"), worker.run)
thread.started.connect(worker.run)
worker.task_completed.connect(self.on_task_completed)
thread.start(QtCore.QThread.NormalPriority)
self.workers.append(worker)
self.threads.append(thread)
self.load[worker.name] = 0
def __del__(self):
for thread in self.threads:
thread.terminate()
def add_task(self, task):
worker_name = min(self.load, key=self.load.get)
self.load[worker_name] += 1
self.worker_task.emit({'worker_name': worker_name, 'fcn': task['fcn'], 'params': task['params']})
def on_task_completed(self, worker_name):
self.load[str(worker_name)] -= 1