[問題] 測試multiprocessing當中manager的dict()

作者: kururu (妳,好不好)   2020-10-16 17:10:58
各位先進達人好,
請問在測試以下程式碼為何結果無效?
from multiprocessing import Process, Manager
def f(d):
d[1] += '111'
d['2'] += 222
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)
以上按照程式邏輯結果print出來是{1: '1', '2': 2}
為什麼f()沒影響到d這個dict呢?
還請指教
謝謝!
作者: IAMPF (PF)   2020-10-16 17:45:00
因為你用multiprocess記憶體不是共用的
作者: tsoahans (ㄎㄎ)   2020-10-16 17:48:00
你是在什麼環境跑的 我跑結果怎麼和你不一樣
作者: kururu (妳,好不好)   2020-10-16 17:50:00
謝謝IAMPF 大回答,請問有建議改良方法嗎?感恩回T大,我在jupyter nb上執行,跟環境有關嗎?
作者: tsoahans (ㄎㄎ)   2020-10-16 17:55:00
這應該是官方的範例改過來的 照理說d應該會變才對https://i.imgur.com/8tiObPz.png
作者: kururu (妳,好不好)   2020-10-16 17:56:00
剛試著換shell執行,好像真的不一樣,是nb不適合測試multiprocessing?
作者: tsoahans (ㄎㄎ)   2020-10-16 17:56:00
有沒有可能是jupyter函式定義的區段沒執行到
作者: kururu (妳,好不好)   2020-10-16 17:57:00
謝謝T大,原來程式碼是沒問題的,我再研究看看是否跟nb環境有關,謝謝
作者: extraymond (extraymond)   2020-10-17 19:35:00
印象中mp會各自clone一份引用的資料,如果要對shareresource進行處理印象中要用shareable data type這可能有關https://bit.ly/3k7mFZh
作者: yuetsu (Super White)   2020-10-19 00:04:00
mp在windows跟linux背後的實作方法不一樣linux用os.fork,記憶體在修改值之前共用(Copy on write)windows則是把變數pickle給新的process,記憶體不會共用然後我發現我講的東西跟這篇文章一點關係都沒有
作者: billy8407 (suprmenode)   2020-11-25 23:24:00
改global變數或回傳(不能return的方式)Mp有個定義share memory 變數的方式,可以去翻翻 mp的document

Links booklink

Contact Us: admin [ a t ] ucptt.com