4

私はPythonを少し新しくしました。私はマルチプロセッシングモジュールについて学んで研究してきましたが、ロックを使用している間にこの問題に悩まされています。ここでPythonでマルチプロセッシングモジュールを使用している間にプロセス間をロックすることができません

は、テストコードです:

import multiprocessing 
from multiprocessing import Pool 

class Param_Class(): 

#Initialisation. 
    def __init__(self): 
     self.counter = multiprocessing.Value('i',0) 
     self.lock = multiprocessing.Lock() 

    def inc_counter(self): 
      lk.acquire() 
      print('Locked {}'.format(multiprocessing.current_process().name)) 
      self.counter.value+=1 
      lk.release() 
      print('Released {}'.format(multiprocessing.current_process().name)) 

param_class = Param_Class() 

def init(lock): 
    global lk 
    lk = lock 


def target(): 
    param_class.inc_counter() 
    code = 0 
    return code 

def handler(i): 
    if i<50: 
     code = target() 
     print(param_class.counter.value) 


if __name__ == '__main__': 
    p = Pool(processes=2,initializer=init, initargs=(param_class.lock,)) 
    p.map_async(handler,range(50)) 
    p.close() 
    p.join() 

私が期待したものもう一つはので、私のカウンターは、プロセスのいずれかが実行されるたびに増分する必要があります実行している間に、各プロセスがロックされてきています。しかし、のプロセスとプロセスの間にインターロックが発生しておらず、2番目のプロセスがカウンタのコピーを処理しているため、が存在します。ここで

が出力されます:

Locked SpawnPoolWorker-1 
Released SpawnPoolWorker-1 
1 
Locked SpawnPoolWorker-1 
Released SpawnPoolWorker-1 
Locked SpawnPoolWorker-2 
2 
Released SpawnPoolWorker-2 
1 
Locked SpawnPoolWorker-1 
Locked SpawnPoolWorker-2 
Released SpawnPoolWorker-1 
Released SpawnPoolWorker-2 
3 
2 
Locked SpawnPoolWorker-1 
Released SpawnPoolWorker-1 
Locked SpawnPoolWorker-2 
4 
Released SpawnPoolWorker-2 
Locked SpawnPoolWorker-1 
3 
Released SpawnPoolWorker-1 
Locked SpawnPoolWorker-2 
5 
Released SpawnPoolWorker-2 
Locked SpawnPoolWorker-1 
4 
Released SpawnPoolWorker-1 
Locked SpawnPoolWorker-2 
6 
Released SpawnPoolWorker-2 
Locked SpawnPoolWorker-1 
5 
Released SpawnPoolWorker-1 
Locked SpawnPoolWorker-2 
7 
Released SpawnPoolWorker-2 
Locked SpawnPoolWorker-1 
6 
Released SpawnPoolWorker-1 
Locked SpawnPoolWorker-2 
8 
Released SpawnPoolWorker-2 
Locked SpawnPoolWorker-1 
7 
Released SpawnPoolWorker-1 
Locked SpawnPoolWorker-2 
9 
Released SpawnPoolWorker-2 
Locked SpawnPoolWorker-1 
8 
Released SpawnPoolWorker-1 
Locked SpawnPoolWorker-2 
10 
Released SpawnPoolWorker-2 
Locked SpawnPoolWorker-1 
9 
Released SpawnPoolWorker-1 
Locked SpawnPoolWorker-2 
11 
Released SpawnPoolWorker-2 
10 
Locked SpawnPoolWorker-1 
Locked SpawnPoolWorker-2 
Released SpawnPoolWorker-1 
Released SpawnPoolWorker-2 
12 
11 
Locked SpawnPoolWorker-1 
Released SpawnPoolWorker-1 
Locked SpawnPoolWorker-2 
13 
Released SpawnPoolWorker-2 
12 
Locked SpawnPoolWorker-1 
Released SpawnPoolWorker-1 
Locked SpawnPoolWorker-2 
14 
Released SpawnPoolWorker-2 
13 
Locked SpawnPoolWorker-1 
Released SpawnPoolWorker-1 
Locked SpawnPoolWorker-2 
15 
Released SpawnPoolWorker-2 
Locked SpawnPoolWorker-1 
14 
Released SpawnPoolWorker-1 
Locked SpawnPoolWorker-2 
16 
Released SpawnPoolWorker-2 
Locked SpawnPoolWorker-1 
15 
Released SpawnPoolWorker-1 
Locked SpawnPoolWorker-2 
17 
Released SpawnPoolWorker-2 
Locked SpawnPoolWorker-1 
16 
Released SpawnPoolWorker-1 
Locked SpawnPoolWorker-2 
18 
Released SpawnPoolWorker-2 
Locked SpawnPoolWorker-1 
17 
Released SpawnPoolWorker-1 
Locked SpawnPoolWorker-2 
19 
Released SpawnPoolWorker-2 
Locked SpawnPoolWorker-1 
18 
Released SpawnPoolWorker-1 
Locked SpawnPoolWorker-2 
20 
Released SpawnPoolWorker-2 
Locked SpawnPoolWorker-1 
19 
Released SpawnPoolWorker-1 
Locked SpawnPoolWorker-2 
21 
Released SpawnPoolWorker-2 
Locked SpawnPoolWorker-1 
20 
Released SpawnPoolWorker-1 
Locked SpawnPoolWorker-2 
22 
Released SpawnPoolWorker-2 
Locked SpawnPoolWorker-1 
21 
Released SpawnPoolWorker-1 
Locked SpawnPoolWorker-2 
23 
Released SpawnPoolWorker-2 
Locked SpawnPoolWorker-1 
22 
Released SpawnPoolWorker-1 
24 
Locked SpawnPoolWorker-1 
Released SpawnPoolWorker-1 
25 
Locked SpawnPoolWorker-1 
Released SpawnPoolWorker-1 
26 
Locked SpawnPoolWorker-1 
Released SpawnPoolWorker-1 
27 
Locked SpawnPoolWorker-1 
Released SpawnPoolWorker-1 
28 

所望の出力は次のようなものでなければなりません:

Locked SpawnPoolWorker-1 
1 
Released SpawnPoolWorker-1 
Locked SpawnPoolWorker-2 
2 
Released SpawnPoolWorker-2 
Locked SpawnPoolWorker-1 
3 
Released SpawnPoolWorker-1 
. 
. 
. 
. 
. 
. 
. 
Locked SpawnPoolWorker-2 
50 
Released SpawnPoolWorker-2 

私はロックを初期化し、それを継承について学ぶためにthisと呼ばきました。私はどこを台無しにしたのか分からない。それはロックかmultiprocessing.Pool呼び出しか、クラスインスタンスを使用しているのか、おそらくターゲット関数自体です。それをバックアップするいくつかの理論でそれについて詳述してください。私はこれについて学びたいだけでなく、それを解決するだけではありません。

得られた出力では、値24から28まで期待どおりに動作し、プロセス2は動作を停止したことに注意してください。そのことについても明確にする必要があります。

P.S .: を避けるには、リンクされた回答に記載されているように、マネージャーを使用してください。また、ロックする必要のない他の変数を使用するため、実行の部分的な並行性を排除することは望ましくありません。モジュールを高速でPythonにしたいと思っています。

答えて

1

明らかに、プロセスが適用受けるたびに、クラスのINITは、従って、各プロセスのためのコピーを作成すると呼ばれます。

これを克服するために、counterをクラス属性として作成する代わりに、プールのinitで渡してグローバルにすることができます。

また、ロックは重要ではありません。

関連する問題