use*_*114 24 python generator multiprocessing
我multiprocessing.Pool()用来并行化一些繁重的计算.
目标函数返回大量数据(一个巨大的列表).我的RAM用完了.
如果没有multiprocessing,我只需将目标函数更改为生成器,通过逐个yield计算结果元素.
我理解多处理不支持生成器 - 它等待整个输出并立即返回它,对吧?没有屈服.有没有办法让Pool工作人员在数据可用时立即生成数据,而无需在RAM中构建整个结果数组?
简单的例子:
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
Run Code Online (Sandbox Code Playgroud)
这是Python 2.7.
Lor*_*ams 17
这听起来像是队列的理想用例:http://docs.python.org/2/library/multiprocessing.html#exchanging-objects-between-processes
只需将结果从汇集的工作人员提供到队列中,然后在主服务器中将其摄取.
请注意,您仍然可能遇到内存压力问题,除非您排队队列的速度几乎与工作人员填充队列一样快.您可以限制队列大小(适合队列的最大对象数),在这种情况下,池化工作人员将阻塞queue.put语句,直到队列中有空间可用.这将对内存使用量设置上限. 但是,如果你这样做,可能是时候重新考虑你是否需要合并和/或是否有意义使用更少的工人.