
multiprocessing 模組
|
263
# 檢查 len(counter)== NBR_OF_PROCESSES,
# 確認每個行程都做了一些工作
assert len(counter) == NBR_OF_PROCESSES
raw_input("Press a key to exit...")
我們剛剛建立了一維的位元組陣列,把它轉換成二維陣列,在 4 個行程之間共用該陣
列,並且允許它們並行地處理相同的記憶體區塊。這個做法幫助你透過多個核心進行平
行化處理,不過,要小心對相同資料點的並行存取—假如你想要避免發生同步化問題,
就必須在
multiprocessing
裡使用鎖定,這會拖慢你的程式碼。
同步化檔案與變數存取
在下列範例裡,我們會檢視多個行程共用及操作狀態的情況—在此案例中,4 個行程分
別遞增共用計數器,若沒有同步化(synchronization),該計數不會是正確的。假如透
過連貫的方式共用資料,你總是必須以某種方式同步化資料的讀寫,否則的話,終究會
弄錯。
通常,同步化方法特定於你所使用的 OS,而且經常特定於你所使用的語言。在這裡,
我們使用 Python 程式庫檢視基於檔案的同步化,並且在 Python 行程之間共用整數
物件。
檔案鎖定
讀寫檔案將是這一節裡最緩慢的資料共用範例。
你可以在範例 9-33 中看到我們的第一個
work
函式,該函式繞行本地計數器,在每一次
迭代中,它開啟檔案並且讀取既有值,遞增它,接著以新值覆蓋舊值。在第一次迭代
中,檔案會是空的或不存在,因此,它將捕捉例外,並且假設該值應該是零。 ...