| 1234567891011121314151617181920212223242526272829303132333435363738394041424344 |
- 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
|