2016-02-13 36 views
1

我有一個類變量聲明爲列表,我想從該類中聲明的方法更新。然而,由於這個方法處理大量的數據,我正在使用多處理來調用它,因此我需要在更新它之前鎖定類變量。我無法弄清楚如何放置這樣的鎖並更新類變量。如果重要的話,我只能在任何時候創造上述課程的一個目標。在Python中的多個進程中共享一個類變量

回答

1

由於python的GIL,多處理只能使用完全獨立的任務,並且沒有共享內存。從https://docs.python.org/2/library/multiprocessing.html#sharing-state-between-processes

from multiprocessing import Process, Value, Array 

def f(n, a): 
    n.value = 3.1415927 
    for i in range(len(a)): 
     a[i] = -a[i] 

if __name__ == '__main__': 
    num = Value('d', 0.0) 
    arr = Array('i', range(10)) 

    p = Process(target=f, args=(num, arr)) 
    p.start() 
    p.join() 

    print num.value 
    print arr[:] 

現在你問,你需要確保在型動物進程不會訪問相同的變量: 但你還是可以讓它的發生,通過使用多重共享磁盤陣列/值同時,並使用Lock。希望,multiprocessing模塊中的所有共享變量都與Lock配對。

要訪問鎖:

num.acquire() # get the lock 
# do stuff 
num.release() # don't forget to release it 

我希望這有助於。

+0

感謝您指點我的文檔。我已經使用Manager對象在進程之間共享數據。謝謝 – bawejakunal

0

如果您使用的multiprocessing模塊(相對於多線程,這是不同的),那麼除非我弄錯了,分叉多進程不共享內存,每個進程將有自己的副本你的班級。這將意味着鎖定不是必需的,但這也意味着類屬性不會像您希望的那樣共享。

多處理模塊確實提供several ways以允許進程之間的通信,包括共享數組對象。也許這就是你要找的。

根據你在做什麼,你也可以考慮使用master-worker模式,你可以在其中創建一個工作類,並使用方法來操作你的數據,產生幾個進程來運行這個類,然後將數據集發送到來自主進程的工作人員使用多處理模塊中的Queue類。

相關問題