processing.py 1.4KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. import types
  2. from multiprocessing import Process
  3. from multiprocessing import Manager
  4. from synergine2.utils import ChunkManager
  5. class ProcessManager(object):
  6. def __init__(
  7. self,
  8. process_count: int,
  9. chunk_manager: ChunkManager,
  10. job_maker: types.FunctionType,
  11. ):
  12. self._process_count = process_count
  13. self._chunk_manager = chunk_manager
  14. self._job_maker = job_maker
  15. def execute_jobs(self, data: list) -> tuple:
  16. with Manager() as manager:
  17. processes = list()
  18. chunks = self._chunk_manager.make_chunks(data)
  19. results = manager.dict()
  20. # TODO: retrouver tests pour savoir si
  21. # les keeped alive sont mieux
  22. for process_number in range(self._process_count):
  23. processes.append(Process(
  24. target=self._job_maker_wrapper,
  25. args=(
  26. process_number,
  27. chunks[process_number],
  28. results,
  29. )
  30. ))
  31. for process in processes:
  32. process.start()
  33. for process in processes:
  34. process.join()
  35. return results.values()
  36. def _job_maker_wrapper(
  37. self,
  38. process_number: int,
  39. chunk: list,
  40. results: dict,
  41. ):
  42. results[process_number] = self._job_maker(chunk)