FlatCAMWorkerStack.py 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. from PyQt5 import QtCore
  2. from FlatCAMWorker import Worker
  3. import multiprocessing
  4. class WorkerStack(QtCore.QObject):
  5. worker_task = QtCore.pyqtSignal(dict) # 'worker_name', 'func', 'params'
  6. thread_exception = QtCore.pyqtSignal(object)
  7. def __init__(self, workers_number):
  8. super(WorkerStack, self).__init__()
  9. self.workers = []
  10. self.threads = []
  11. self.load = {} # {'worker_name': tasks_count}
  12. # Create workers crew
  13. for i in range(0, workers_number):
  14. worker = Worker(self, 'Slogger-' + str(i))
  15. thread = QtCore.QThread()
  16. worker.moveToThread(thread)
  17. # worker.connect(thread, QtCore.SIGNAL("started()"), worker.run)
  18. thread.started.connect(worker.run)
  19. worker.task_completed.connect(self.on_task_completed)
  20. thread.start(QtCore.QThread.NormalPriority)
  21. self.workers.append(worker)
  22. self.threads.append(thread)
  23. self.load[worker.name] = 0
  24. def __del__(self):
  25. for thread in self.threads:
  26. thread.terminate()
  27. def add_task(self, task):
  28. worker_name = min(self.load, key=self.load.get)
  29. self.load[worker_name] += 1
  30. self.worker_task.emit({'worker_name': worker_name, 'fcn': task['fcn'], 'params': task['params']})
  31. def on_task_completed(self, worker_name):
  32. self.load[str(worker_name)] -= 1