0
Кто-нибудь знает, на каком этапе пул python запускает основной процесс? О создании пула или при первом запуске работы?Когда вилка пула python?
Кто-нибудь знает, на каком этапе пул python запускает основной процесс? О создании пула или при первом запуске работы?Когда вилка пула python?
Когда создаются объекты multiprocessing.Pool
, он порождает некоторые потоки, но не вилка. Развертка выполняется при вызове других методов Pool
и только в системах UNIX (в Windows нет вилки).
Вы можете увидеть это чтение исходного кода Pool.__init__
метода,:
class Pool(object):
'''
Class which supports an async version of applying functions to arguments.
'''
Process = Process
def __init__(self, processes=None, initializer=None, initargs=(),
maxtasksperchild=None):
self._setup_queues()
self._taskqueue = queue.Queue()
self._cache = {}
self._state = RUN
self._maxtasksperchild = maxtasksperchild
self._initializer = initializer
self._initargs = initargs
if processes is None:
try:
processes = cpu_count()
except NotImplementedError:
processes = 1
if processes < 1:
raise ValueError("Number of processes must be at least 1")
if initializer is not None and not callable(initializer):
raise TypeError('initializer must be a callable')
self._processes = processes
self._pool = []
self._repopulate_pool()
self._worker_handler = threading.Thread(
target=Pool._handle_workers,
args=(self,)
)
self._worker_handler.daemon = True
self._worker_handler._state = RUN
self._worker_handler.start()
self._task_handler = threading.Thread(
target=Pool._handle_tasks,
args=(self._taskqueue, self._quick_put, self._outqueue, self._pool)
)
self._task_handler.daemon = True
self._task_handler._state = RUN
self._task_handler.start()
self._result_handler = threading.Thread(
target=Pool._handle_results,
args=(self._outqueue, self._quick_get, self._cache)
)
self._result_handler.daemon = True
self._result_handler._state = RUN
self._result_handler.start()
self._terminate = Finalize(
self, self._terminate_pool,
args=(self._taskqueue, self._inqueue, self._outqueue, self._pool,
self._worker_handler, self._task_handler,
self._result_handler, self._cache),
exitpriority=15
)
Спасибо за ответ! У меня есть еще один :) В моем коде я создаю пул, тогда у меня есть логика, которая загружает сотрудников в память, а затем я бросаю задания в пул и перебираю их с помощью imap_unsorted. Из вашего ответа я вижу, что вилка происходит ПОСЛЕ логики, которая загружает сотрудников в память, и это плохо, так как я дублирую этот персонал во всех рабочих подпроцессах. Знаете ли вы, как я могу избежать этого (т. Е. Форсировать вилку перед тем, как я начну загружать персонал в память)? Благодаря!!! – diemacht
@diemacht Я думаю, вам следует передать параметр '' initializer' '(http://docs.python.org/2/library/multiprocessing.html#multiprocessing.pool.multiprocessing.Pool) объекта 'Pool'. Это должна быть функция, призванная инициализировать рабочих, и это кажется правильным местом для того, чтобы делать то, что вы хотите. – Bakuriu