processing.py 1.4KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. # coding: utf-8
  2. import types
  3. from multiprocessing import Pool
  4. from synergine2.base import BaseObject
  5. from synergine2.utils import ChunkManager
  6. class ProcessManager(BaseObject):
  7. def __init__(
  8. self,
  9. process_count: int,
  10. chunk_manager: ChunkManager,
  11. ):
  12. self._process_count = process_count
  13. self._chunk_manager = chunk_manager
  14. self.pool = Pool(processes=self._process_count)
  15. def __getstate__(self):
  16. self_dict = self.__dict__.copy()
  17. self_dict['pool'] = None
  18. return self_dict
  19. def chunk_and_execute_jobs(self, data: list, job_maker: types.FunctionType) -> list:
  20. chunks = self._chunk_manager.make_chunks(data)
  21. if self._process_count > 1:
  22. results = self.pool.starmap(job_maker, [(chunk, i, self._process_count) for i, chunk in enumerate(chunks)])
  23. else:
  24. results = [job_maker(data, 0, 1)]
  25. return results
  26. def execute_jobs(self, data: object, job_maker: types.FunctionType) -> list:
  27. # TODO: Is there a reason to make multiprocessing here ? data is not chunked ...
  28. if self._process_count > 1:
  29. results = self.pool.starmap(job_maker, [(data, i, self._process_count) for i in range(self._process_count)])
  30. else:
  31. results = [job_maker(data, 0, 1)]
  32. return results
  33. def __del__(self):
  34. if self.pool:
  35. self.pool.terminate()