我有一个包含(大量)不同属性的类,包括一些词典。当我将类的实例传递给一个新进程时,所有数值似乎都被正确传递,但是类对象中的任何字典都被清空了。
这是我编写的一个简单测试,用于演示我的问题:
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 {}
答案 0 :(得分:1)
在多处理模块的文档中清楚地描述了该问题:windows缺少fork()
系统调用,因此在Windows上,模块源代码在每个进程开始时被重新评估,因此当前状态不是保存。 (在基于un * x的系统上,包括OSX,使用fork实现Process,并保留状态)
请注意,我在谈论整个python模块的状态。
您持有状态的方式是错误的:a
类的b
和State
成员是类范围内的“静态”成员,它们不属于一个State
个对象。在执行state.a = 11
时,您正在修改State
类,而不是类的实例。
a
和b
是State
类的实例成员,那么您的代码可以正常工作:
class State(object):
def __init__(self)
self.a = 0
self.b = {}
然后,将state
实例传递给新进程,将按预期正确传递该值。
答案 1 :(得分:0)
我最后解决了这个问题,除了状态之外还明确地传递了字典。 e.g。
p = Process(target=f, args=(state, i, state.b))