簡體   English   中英

Python多處理在類中共享dict

[英]Python multiprocessing shared dict inside a class

我想了解多處理和管理器如何工作以共享內存

我有一個類,在類上創建了一個字典。 init我想使用多處理來調用填充字典的類函數(每個進程添加一個不同的鍵)。

import multiprocessing as mp
from multiprocessing import Process, Manager

class num:
    def __init__(self):
        manager = Manager()
        d = manager.dict()

        # Setup list of processes
        processes = [mp.Process(target=self.f, args=(d,i)) for i in range(5)]

        #Run processes 
        for p in processes:
            p.start()

        #Exit the completed processes
        for p in processes:
            p.join()

        print d

    def f(self,d,i):
        d[str(i)] = []
        d[str(i)].append(i)


if __name__ == '__main__':      
    test = num()

結果:

{'1': [], '0': [], '3': [], '2': [], '4': []}

f()里面的列表也需要共享嗎? 怎么樣和為什么?

您需要更改函數f的行:

d['i'] = [i]

喜歡的東西

d[str(i)] = i

這樣你的進程就不會覆蓋共享字典中的彼此的條目。 在那之后,它適用於我(在Python 2.7.3中),打印出來

{'1': 1, '0': 0, '3': 3, '2': 2, '4': 4}

(另外,您發布的代碼缺少import multiprocessing as mp

更新 :如果您只想將共享字典中的值作為列表,那么這是一個簡單的更改,例如

d[str(i)] = [i]

如果您希望在所有進程中共享每個列表,那么您可能需要使用manager.list()在主進程中創建這些列表,並將這些列表傳遞給所有子進程,例如:

    count = 5
    lists = [manager.list() for i in range(count)]
    for i in range(count):
        d[i] = lists[i]
    processes = [mp.Process(target=self.f, args=(d,i, lists)) for i in range(count)]

[...]

def f(self,d,i, lists):
    for j in range(i):       # just an example to show 
        lists[j].append(i)   # that the lists are shared between processes

我還嘗試直接在托管dict中嵌套托管列表,但由於某種原因,這不起作用,並且子進程無法更新列表。 如圖所示單獨傳遞它們似乎有效,例如我可以讓每個子進程更新多個列表:

{0: [1, 2, 3, 4], 1: [2, 3, 4], 2: [3, 4], 3: [4], 4: []}

更換:

d[str(i)].append(i)

有:

d[str(i)] += [i]

解決這個問題。

結果:

{'1': [1], '0': [0], '3': [3], '2': [2], '4': [4]}

但我真的想知道為什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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