2016-05-11 4 views
0

Я пытаюсь отправить задания в пул один за другим (из-за ограничений памяти я не могу использовать карту). Возможно ли, чтобы пул переварил, есть ли у него рабочие и в противном случае ждать? , например. могу ли я сделать что-то вроде этого? p = Pool(n_workers) for item in list: p.work_on_this(item) , где work_on_this отправляет задание, если в пуле имеется больше рабочих, и в противном случае дождитесь его завершения.многопроцессорный питон можно отправить в пул задание последовательно

+0

Вы могли бы искать что-то подобное http://stackoverflow.com/questions/17909132/python-multiprocessing-set-spawning-process-to-wait. С этим я думаю, что можно построить некоторую логику. – pmaniyan

+1

Вы не можете использовать 'map'? Установка 'chunksize = 1' будет отправлять задания один за другим. – tdelaney

+1

Как насчет 'imap' вместо' map'? – tjollans

ответ

0

Способ решения проблемы заключается в использовании семафора, инициализированного количеством рабочих. Вы приобретаете и освобождаете семафор перед кормлением пула и после того, как работник выполнил задание.

Вот пример работы с Python 2.6 или выше.

from threading import Semaphore 
from multiprocessing import Pool 


def TaskManager: 
    def __init__(self, processes): 
     self.pool = Pool(processes=processes) 
     self.workers = Semaphore(processes) 

    def new_task(self): 
     """Start a new task, block if all workers are busy.""" 
     self.workers.acquire() 
     self.pool.apply_async(function, callback=self.task_done) 

    def task_done(self, results): 
     """Called once task is done, releases the caller if blocked.""" 
     self.workers.release() 
Смежные вопросы