2011-09-08 48 views
3

我有一个包含大量不同属性(包括几个字典)的类。当我将一个类的实例传递给一个新进程时,所有数值看起来都正确传入,但类对象中的任何字典都将被清空。Python传递字典在多处理中处理

这里有一个简单的测试,我做了演示我的问题:

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

当我测试您的示例时,我会得到您的预期输出。 – zeekay

+0

等什么?我在Windows 7上使用Python 2.6.6,你呢? :( – numegil

+0

OS X 10.7.1,Python 2.7.1。 – zeekay

回答

0

我结束了通过明确地除了州之外传递字典来解决这个问题。例如

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

1

的问题是针对多处理模块的文档中描述清楚:视窗缺乏fork()系统调用,所以在Windows中,模块的源代码被在每一个过程的开始重新评估,从而当前状态不被保留。 (在基于un * x的系统上,包括OSX,Process使用fork实现,并且状态保留)

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

你拿着状态的方法是错了:State类的ab成员是类范围的“静态”的成员,他们是不是State对象的实例的一部分。在执行state.a = 11时,您正在修改State类,而不是该类的一个实例。

你的代码会工作的罚款,如果ab一直是State类的实例成员:

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

然后,传递state实例到一个新的进程,将有正确传递的价值预期。