Мне интересно, как класс Python Multiprocessing.Pool работает с картами, imap и map_async. Моя конкретная проблема заключается в том, что я хочу сопоставить итератор, который создает объекты с большим объемом памяти, и не хочу, чтобы все эти объекты создавались в памяти одновременно. Я хотел посмотреть, будут ли различные функции map() истощать мой итератор или разумно вызывать функцию next() только при медленном развитии дочерних процессов, поэтому я взломал некоторые тесты как таковые:
Код: Выделить всё
def g():
for el in xrange(100):
print el
yield el
def f(x):
time.sleep(1)
return x*x
if __name__ == '__main__':
pool = Pool(processes=4) # start 4 worker processes
go = g()
g2 = pool.imap(f, go)
g2.next()
И так далее с картами, imap и map_async. Однако это самый вопиющий пример, поскольку простой вызов next() один раз на g2 распечатывает все мои элементы из моего генератора g(), тогда как если бы imap делал это «лениво», я бы ожидал, что он вызовет только go.next () один раз и, следовательно, распечатывать только «1».
Может ли кто-нибудь прояснить, что происходит, и есть ли какой-то способ «лениво» использовать пул процессов? оценить итератор по мере необходимости?
Спасибо,
Гейб
Подробнее здесь:
https://stackoverflow.com/questions/531 ... -iteration