【发布时间】:2011-07-16 04:36:21
【问题描述】:
我想知道 python 的 Multiprocessing.Pool 类与 map、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 等等。然而,这是最明显的例子,因为在 g2 上简单地调用一次 next() 会打印出我的生成器 g() 中的所有元素,而如果 imap 是“懒惰”地这样做,我希望它只调用 go.next () 一次,因此只打印出 '1'。
有人能弄清楚发生了什么吗?是否有某种方法可以让进程池根据需要“懒惰地”评估迭代器?
谢谢,
加布
【问题讨论】:
-
在删除
time.sleep调用并在f中添加print os.getpid(), x之后,行为看起来更加奇怪,有时只打印2 或3 个不同的PID,并且总是执行不同数量的迭代。 ..顺便说一句,您使用的是什么 Python 版本? -
Python 2.6.6 (r266:84292, Dec 26 2010, 22:31:48) 标准 debian 安装。