Мне интересно, как класс 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()
И так далее с map, imap и map_async. Это самый вопиющий пример, так как просто вызов next() за один раз на g2 выводит все мои элементы из моего генератора g(), тогда как ifap делает это "лениво", я ожидал бы, что он будет только называть go.next() один раз и, следовательно, распечатать только "1".
Может кто-то прояснить, что происходит, и если есть способ, чтобы пул процессов "лениво" оценивал итератор по мере необходимости?
Спасибо,
Гейб