2013-02-13 6 views

ответ

0

Когда создаются объекты 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 
      ) 
+0

Спасибо за ответ! У меня есть еще один :) В моем коде я создаю пул, тогда у меня есть логика, которая загружает сотрудников в память, а затем я бросаю задания в пул и перебираю их с помощью imap_unsorted. Из вашего ответа я вижу, что вилка происходит ПОСЛЕ логики, которая загружает сотрудников в память, и это плохо, так как я дублирую этот персонал во всех рабочих подпроцессах. Знаете ли вы, как я могу избежать этого (т. Е. Форсировать вилку перед тем, как я начну загружать персонал в память)? Благодаря!!! – diemacht

+0

@diemacht Я думаю, вам следует передать параметр '' initializer' '(http://docs.python.org/2/library/multiprocessing.html#multiprocessing.pool.multiprocessing.Pool) объекта 'Pool'. Это должна быть функция, призванная инициализировать рабочих, и это кажется правильным местом для того, чтобы делать то, что вы хотите. – Bakuriu

Смежные вопросы