使用Python多处理模块跨多个进程共享状态

时间:2012-09-30 16:58:59

标签: python multiprocessing

我有一个执行计算的函数,并将计算状态保存在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()

更新:感谢您的评论。我现在有一个有效的例子,发布在下面。

2 个答案:

答案 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