簡體   English   中英

使用共享內存進行多處理

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM