我有一个执行计算的函数,并将计算状态保存在result
字典中(默认默认参数)。我首先运行它,然后使用多处理模块运行多个进程。我需要在每个并行进程中再次运行该函数,但是在此函数运行一次后,我需要返回缓存状态,不能重新计算该值。在我的例子中,这个要求没有意义,但我想不出一个需要这个限制的简单现实论证。使用dict作为可变默认参数有效,但是
这不适用于多处理模块。我可以使用什么方法来获得相同的效果?
请注意,状态值是(包含类值的字典),不能作为参数afaik传递给多个进程。
SO问题Python multiprocessing: How do I share a dict among multiple processes?似乎涵盖了类似的理由。也许我可以使用经理来做我需要的事情,但这并不明显。或者,也许可以将值保存到全局对象,每https://stackoverflow.com/a/4534956/350713,但这看起来不是很优雅。
def foo(result={}):
if result:
print "returning cached result"
return result
result[1] = 2
return result
def parafn():
from multiprocessing import Pool
pool = Pool(processes=2)
arglist = []
foo()
for i in range(4):
arglist.append({})
results = []
r = pool.map_async(foo, arglist, callback=results.append)
r.get()
r.wait()
pool.close()
pool.join()
return results
print parafn()
更新:感谢您的评论。我现在有一个有效的例子,发布在下面。
答案 0 :(得分:1)
我认为进程之间最安全的交换数据方式是使用Queue,多处理模块为您提供了两种类型的Queue和JoinableQueue,请参阅文档:
http://docs.python.org/library/multiprocessing.html#exchanging-objects-between-processes
答案 1 :(得分:1)
此代码不会赢得任何美容奖品,但对我有用。
此示例与问题中的示例类似,但有一些小的更改。
add_to_d
构造有点尴尬,但我没有看到更好的方法来做到这一点。
摘要:我将foo
的{{1}}状态(这是一个可变的默认参数)复制回d
,
但是池创建的新进程空间中的foo
。完成此操作后,再在新进程空间中foo
不会重新计算缓存的值。
这似乎是池初始化程序所做的,尽管文档不是很明确。
foo