2011-09-08 7 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

問題が明らかにマルチプロセッシングモジュールのドキュメントに記載されている:Windowsは、fork()システムコールを欠いているように、Windows上に、モジュールのソースコードは、各プロセスの開始時に再評価されます、このように現在の状態保存されません。 (OSXを含むun * xベースのシステムでは、プロセスはforkを使って実装され、状態は保存されます)

私はPythonモジュール全体の状態について話しています。

状態を保持するあなたの方法が間違っている:Stateクラスのabメンバーは、クラス全体で「静的」メンバーであり、彼らはStateオブジェクトのインスタンスの一部ではありません。 state.a = 11を実行するときは、クラスのインスタンスではなくStateクラスを変更しています。 abStateクラスのインスタンスメンバーであった場合

あなたのコードがうまく働いているだろう。期待通りの新しいプロセスにstateインスタンスを渡し、その後、

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

、正しく値を通過しているだろう。

関連する問題