繁体   English   中英

Python将字典传递给多处理中的进程

[英]Python passing dictionary to process in multiprocessing

我有一个包含(大量)不同属性的类,包括一些字典。 当我将类的实例传递给一个新进程时,所有数值似乎都被正确传递,但是类对象中的任何字典都被清空了。

这是我编写的一个简单测试,用于演示我的问题:

from multiprocessing import Process

class State:
    a = 0
    b = {}

def f(s, i):
    print "f:", s.a, s.b

def main():

    state = State()

    state.a = 11
    state.b['testing'] = 12

    print "Main:", state.a, state.b

    ps = []
    for i in range(1):
        p = Process(target=f, args=(state, i))
        p.start()           # Do the work
        ps.append(p)
    for p in ps:
        p.join()

if __name__ == '__main__':
    main()

我期待输出

Main: 11 {'testing': 12}
f: 11 {'testing': 12}

但我得到了

Main: 11 {'testing': 12}
f: 11 {}

在多处理模块的文档中清楚地描述了该问题:windows缺少fork()系统调用,因此在Windows上,模块源代码在每个进程的开始时被重新评估,因此不保留当前状态。 (在基于un * x的系统上,包括OSX,使用fork实现Process,并保留状态)

请注意,我在谈论整个python模块的状态。

你持有状态的方式是错误的: State类的ab成员是类范围的“静态”成员,它们不是State对象实例的一部分。 在执行state.a = 11 ,您正在修改State类,而不是类的实例。

如果abState类的实例成员,那么你的代码可以正常工作:

class State(object):
    def __init__(self)
        self.a = 0
        self.b = {}

然后,将state实例传递给新进程,将按预期正确传递该值。

我最后解决了这个问题,除了状态之外还明确地传递了字典。 例如

p = Process(target=f, args=(state, i, state.b))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM