2

こんにちは、次のマルチプロセス コードがあり、決定ツリーのすべてのエンド ノードまたはリーフによってグローバル変数 ctr が更新されるようにしたいと考えています。しかし、それは起こっていません。

    ctr=0

            def update(l,n):
               global ctr
               l.acquire()
               ctr+=n
               l.release()

    def func(x,i):
        p2=[]
        if i > 100:
           lock=Lock()
                        update(lock,len(rl))
        # create list a1
        # create list a2
        i=len(a1)
        for a in a1:
            for b in a2:
                if x > (a+b):
                    proc=Process(target=func,args=(a+b,i,))
                    p2.append(proc)

        for p in p2:
            p.start()
            p.join()
4

1 に答える 1

1

Python (またはその他の言語) で新しいプロセスを開始すると、すべてのプロセスで同じメモリ セグメントが読み取りアクセスに使用されます。ただし、メモリへの書き込み (変数の更新など) を開始するとすぐに、その変数は新しいプロセスの独自のメモリ セグメントにコピーされます。

つまり、グローバル変数を更新して、複数のプロセスが同じ値を参照することを期待することはできません。そのためには、ある種の共有メモリが必要です。

マルチプロセッシングに関するドキュメントを確認してください

ただし、グローバル変数の更新にはある程度のロックが必要であり、基本的に複数のプロセスが連続して動作するように強制されることに注意してください。これは、ユースケースによってはパフォーマンスに悪影響を及ぼす可能性があります。できる限りグローバル状態を使用しないようにする必要があります (これはより一般的なアドバイスですが、マルチプロセッシングの場合、グローバル状態を使用するのはさらに悪いことです)。

于 2013-06-13T06:37:29.330 に答える