0

pp モジュールを使用している場合、オブジェクト 'test' の辞書 'params' を更新できません。なぜこれが起こるのか誰が教えてくれますか? コードを見てください:

import pp

class test(object):
    params = {'n': None}
    dic2 = {}
    n = None

    def __init__(self, i):
        #won't change
        self.params['n'] = i
        #changed
        self.n = i
        self.dic2 = {i: i}

    def run(self):
        print self.n, self.params, self.dic2

job_server = pp.Server()

jobs = []

for i in xrange(10):
    t = test(i)
    #won't change
    t.params['n'] = i
    #changed
    t.n = i
    t.run()
    jobs.append(job_server.submit(t.run))

[job() for job in jobs]

結果:

0 {'n': 0} {0: 0}
1 {'n': 1} {1: 1}
2 {'n': 2} {2: 2}
3 {'n': 3} {3: 3}
4 {'n': 4} {4: 4}
0 {'n': None} {0: 0}
1 {'n': None} {1: 1}
2 {'n': None} {2: 2}
3 {'n': None} {3: 3}
4 {'n': None} {4: 4}

pp を使用するとわかるように、「params['n']」は更新できません。それは奇妙な振る舞いです。これはどのように起こりますか?

4

1 に答える 1

3

これは、マルチプロセッシング モジュールの一般的な落とし穴です。

のような呼び出しを行うとjob_server.submit(t.run)、オブジェクトtはピクルされ、新しいプロセスに送信され、ピクル解除され、run実行され、戻り値がピクルされ、メイン プロセスに送り返され、ピクル解除されます。

現在、クラスの酸洗は実際にはサポートされていません (こちらを参照)。pickle は名前を pickles するだけで、unpickle するときにモジュールを再インポートしてクラス オブジェクトを取得します。

使用している変数はクラス変数であるため、モジュールが再インポートされると再初期化されます。関数の属性についても同じことが起こります。

これらの変数の値を保持したい場合は、それらをインスタンス変数にする必要があります。

于 2012-11-02T10:14:49.087 に答える