Я использую multiprocessing.Pool()
для распараллеливания некоторых тяжелых вычислений.
Целевая функция возвращает много данных (огромный список). У меня закончилась оперативная память.
Без multiprocessing
, я просто изменил бы целевую функцию в генератор, yield
получая результирующие элементы один за другим, когда они будут вычислены.
Я понимаю, что многопроцессорность не поддерживает генераторы - она ждет весь вывод и возвращает его сразу, верно? Без поддавки. Есть ли способ заставить рабочих Pool
получить данные, как только они станут доступны, без построения всего массива результатов в ОЗУ?
Простой пример:
def target_fnc(arg):
result = []
for i in xrange(1000000):
result.append('dvsdbdfbngd') # <== would like to just use yield!
return result
def process_args(some_args):
pool = Pool(16)
for result in pool.imap_unordered(target_fnc, some_args):
for element in result:
yield element
Это Python 2.7.