多處理:解決全域字典中的同步和資料共享
在多執行緒環境中,處理資料並發存取和維護同步變得至關重要。考慮一個程序,其中有多個子進程在佇列上工作並操作全域字典 D。
當子程序修改 D 時,這些更新在進程內可見。然而,主進程加入佇列後,在主進程中列印D會顯示一個空字典。這是由存取共享資源 D 時的同步問題引起的。
要解決此問題,可以使用 Manager 物件。多處理中的 Manager 類別可以建立和管理共用對象,包括字典。以下調整後的 python 程式碼示範了其用法:
from multiprocessing import Process, Manager def f(d): d[1] += '1' d['2'] += 2 if __name__ == '__main__': manager = Manager() d = manager.dict() d[1] = '1' d['2'] = 2 p1 = Process(target=f, args=(d,)) p2 = Process(target=f, args=(d,)) p1.start() p2.start() p1.join() p2.join() print(d)
透過利用 Manager 對象,共享字典 D 儲存在所有進程都可以存取的共享記憶體位置中。這可以確保同步並防止存取字典時的競爭條件,即使跨多個進程也是如此。
執行此修改後的程式碼應產生以下輸出:
{1: '111', '2': 6}
證明子程序所做的修改即使在加入進程後,共用字典中的內容也是可見且持久的。
以上是如何確保多個子程序存取的全域字典中的資料一致性?的詳細內容。更多資訊請關注PHP中文網其他相關文章!