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() 

我的預期是什麼,而另一種是執行,所以我的計數器應增加每次執行要麼進程的時間被鎖每個進程。然而,的互鎖過程和第二處理之間發生的事情是工作在櫃檯上的副本。

這裏是輸出:

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瞭解初始化鎖和繼承它。我無法理解我弄亂了什麼。是鎖定還是調用或使用類實例或者目標函數本身。請用一些理論來詳細說明它以支持它。我想了解這一點,而不僅僅是解決它。

注意如何,得到的輸出,它的工作原理是從值24有望28和處理2剛剛停止工作。需要澄清那一個。

P.S .:我想避免使用管理器,因爲它是重量級,如鏈接答案中所述。另外,我不想消除執行的部分併發性,因爲我將使用它不需要被鎖定其他變量,我想模塊保持快速和Python的。

回答

1

很明顯,每當該過程經歷一個應用程序時,就會調用該類,因此會爲每個進程創建一個副本。

因此,要解決這個問題,而不是創建計數器作爲一個類的屬性,它可以在游泳池的init傳遞並取得全球性的。

此外,鎖是微不足道的。