Python多進程編程是在單個程序中使用多個並發執行序列的方法。可以創建子進程,每個子進程可以運行並執行操作。在使用多個並發執行序列的同時,共享全局變量是一個非常普遍的問題。在此文章中,我們將討論在Python多進程編程中共享全局變量的方法。
一、使用Manager對象共享全局變量
Manager對象是一個專為Python並發編程所設計的類,可以很容易地共享全局變量。使用Manager對象共享全局變量時,我們需要使用multiprocessing模塊中的Manager對象。
import multiprocessing
def worker(idx, val, dic):
val.value += idx
dic[idx] = val.value
if __name__ == "__main__":
value = multiprocessing.Value('d', 0.0)
dictionary = multiprocessing.Manager().dict()
jobs = [multiprocessing.Process(target=worker, args=(idx, value, dictionary)) for idx in range(5)]
for j in jobs:
j.start()
for j in jobs:
j.join()
print(dictionary.values())
在上述代碼中,我們創建了一個Manager對象,用於共享全局變量(dictionary)。將子進程交替運行,執行worker函數。在worker函數中,我們更新了val變量並在dictionary中記錄每個進程的狀態。
二、使用共享數組共享全局變量
共享數組允許我們在多個進程之間共享數據。使用共享數組共享全局變量時,需要使用Python中提供的共享內存。
import multiprocessing
def worker(idx, arr):
arr[idx] = idx * idx
if __name__ == "__main__":
arr = multiprocessing.Array('i', range(5))
jobs = [multiprocessing.Process(target=worker, args=(idx, arr)) for idx in range(5)]
for j in jobs:
j.start()
for j in jobs:
j.join()
print(arr[:])
在上述代碼中,我們創建了一個共享數組arr,在worker函數中更新數組arr的值,並在main函數中輸出數組的值。在這裡,我們只使用了一個數組,但是在更具體的應用中,可以使用多個共享數組來存儲複雜的數據結構。
三、使用共享鎖控制進程訪問
共享鎖可以用於在進程之間共享同步對象。當有多個進程嘗試同時訪問某一資源時,共享鎖可以保證其原子性。
import multiprocessing
def worker(val, lock):
for i in range(5):
with lock:
print(val.value)
val.value += 1
if __name__ == "__main__":
val = multiprocessing.Value('i', 0)
lock = multiprocessing.Lock()
jobs = [multiprocessing.Process(target=worker, args=(val, lock)) for idx in range(5)]
for j in jobs:
j.start()
for j in jobs:
j.join()
在上述代碼中,我們使用了Val對象和Lock對象來共享變量和同步進程。在每個進程中,我們使用with語句來獲取鎖對象,確保同步的實現。這裡可以看到,輸出結果是原子性的。
四、使用共享隊列傳遞數據
另一種共享全局變量的方法是使用共享隊列進行數據傳遞。
import multiprocessing
def worker(q):
for i in range(3):
item = q.get()
print(item)
if __name__ == "__main__":
q = multiprocessing.Queue()
jobs = [multiprocessing.Process(target=worker, args=(q,)) for idx in range(5)]
for j in jobs:
j.start()
for j in jobs:
q.put("hello")
for j in jobs:
j.join()
在上述代碼中,我們創建一個共享隊列,向隊列中發送數據並在每個進程中獲取數據。在使用共享隊列時,需要注意使用put和get方法進行隊列操作。
五、使用共享內存實現高速緩存
將數據存儲在共享內存中是實現高速緩存的一種有效方法。使用shelve模塊可以更好地實現共享內存。
import multiprocessing
import shelve
def worker(idx, cache):
cache['key_%d' % idx] = idx
if __name__ == '__main__':
cache = shelve.open('Cache', writeback=True)
jobs = [multiprocessing.Process(target=worker, args=(idx, cache)) for idx in range(1000)]
for j in jobs:
j.start()
for j in jobs:
j.join()
print(cache['key_0'], cache['key_1'], cache['key_999'])
cache.close()
在上述代碼中,我們使用了shelve模塊將數據存儲在磁盤上的共享內存中。在每個進程中,我們使用shelve模塊對數據進行操作,確保數據存儲的正確性。在程序結束後,我們可以使用相同的鍵來檢索值。
六、總結:
Python多進程編程是一種方便且高效執行操作的方法,但是在共享全局變量時需要格外小心。在本文中,我們討論了使用Manager對象、共享數組、共享鎖、共享隊列和共享內存實現高速緩存的方法來共享全局變量。需要仔細研究不同的方法,並根據需要選擇最適合自己應用程序的方法。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/238271.html