[英]Multiprocessing using shared memory
有人可以給我提供示例代碼,以便在使用鎖的python多處理模塊中,在一組工作進程甚至單個生成的進程之間共享可寫數組或列表嗎? 我下面的代碼產生了2個進程,其中一個應向共享數組打印“ 1”,另一個應向共享數組打印“ 2”。 但是,當我嘗試在處理后打印出數組的元素時,它只會顯示0列表。 我要去哪里錯了? 我希望在多個進程之間共享可寫的數據結構。
下面是我的代碼:
import multiprocessing
arr=multiprocessing.Array('i',10,lock=True)
lock=multiprocessing.RLock()
def putitin(n):
for i in range(5):
lock.acquire()
arr.append(n)
lock.release()
return
p1=multiprocessing.Process(target=putitin,args=(1,))
p2=multiprocessing.Process(target=putitin,args=(2,))
p1.start()
p2.start()
p1.join()
p2.join()
for i in range(10):
print(arr[i])
代碼的一個潛在問題是,要在Windows上使用multiprocessing
,您需要將主進程的代碼放在if __name__ == '__main__':
塊中。 請參閱《 多處理編程指南 》的Windows部分的“ 安全導入主模塊”小節。
另一個主要問題是您正在嘗試在流程之間共享全局變量。 這將不起作用,因為每個進程都在自己的未共享內存空間中運行,因此每個子進程都有自己的arr
。 (不過,只是模塊級常量的變量是可以的)
最后, multiprocessing.Array
具有固定的大小,並沒有extend()
你的代碼試圖在使用這種方法putitin()
函數-因此看來你也希望有一個可以寫入的可調整大小的容器(即下令,也許可通過整數索引訪問)。
在這種情況下,類似以下的內容可能是合適的。 您無需在更改對象之前顯式鎖定對象,因為它是線程安全的共享對象。
import multiprocessing
def putitin(lst, value):
for i in range(5):
lst.append(value)
if __name__ == '__main__':
manager = multiprocessing.Manager()
lst = manager.list()
p1 = multiprocessing.Process(target=putitin, args=(lst, 1))
p2 = multiprocessing.Process(target=putitin, args=(lst, 2))
p1.start()
p2.start()
p1.join()
p2.join()
for i in range(len(lst)):
print(lst[i])
輸出:
1
1
1
1
1
2
2
2
2
2
我在您的代碼中發現了一些問題。 首先,將所有共享資源傳遞給child並使用if __name__ == '__main__'
似乎是一個好主意 。 其次,我不認為multiprocessing.Array
具有append()
方法(至少在Python2和Python3上對我不起作用)。 第三,由於您使用的是lock=True
所以我認為您不需要其他鎖。
如果需要將值附加到數組,則可以使用單獨的Counter變量(請參見下面的代碼)。
import multiprocessing
def putitin(n, arr, counter):
for i in range(5):
with counter.get_lock():
index = counter.value
counter.value += 1
arr[index] = n
if __name__ == '__main__':
arr = multiprocessing.Array('i', 10,lock=True)
counter = multiprocessing.Value('i', 0, lock=True)
p1 = multiprocessing.Process(target=putitin,args=(1, arr, counter))
p2 = multiprocessing.Process(target=putitin,args=(2, arr, counter))
p1.start()
p2.start()
p2.join()
p1.join()
for i in range(10):
print(arr[i])
話雖如此,您的高層目標是什么? 您正在嘗試實現什么? 也許可以使用multiprocessing.Pool
?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.