作者kururu (妳,好不好)
看板Python
標題[問題] 測試multiprocessing當中manager的dict()
時間Fri Oct 16 17:10:58 2020
各位先進達人好,
請問在測試以下程式碼為何結果無效?
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呢?
還請指教
謝謝!
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 210.71.217.246 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/Python/M.1602839460.A.884.html
1F:→ IAMPF: 因為你用multiprocess記憶體不是共用的 10/16 17:45
2F:推 tsoahans: 你是在什麼環境跑的 我跑結果怎麼和你不一樣 10/16 17:48
3F:→ kururu: 謝謝IAMPF 大回答,請問有建議改良方法嗎?感恩 10/16 17:50
4F:→ kururu: 回T大,我在jupyter nb上執行,跟環境有關嗎? 10/16 17:51
5F:→ tsoahans: 這應該是官方的範例改過來的 照理說d應該會變才對 10/16 17:55
7F:→ kururu: 剛試著換shell執行,好像真的不一樣,是nb不適合測試multi 10/16 17:56
8F:→ kururu: processing? 10/16 17:56
9F:→ tsoahans: 有沒有可能是jupyter函式定義的區段沒執行到 10/16 17:56
10F:→ kururu: 謝謝T大,原來程式碼是沒問題的,我再研究看看是否跟nb環 10/16 17:57
11F:→ kururu: 境有關,謝謝 10/16 17:57
12F:推 extraymond: 印象中mp會各自clone一份引用的資料,如果要對share 10/17 19:35
13F:→ extraymond: resource進行處理印象中要用shareable data type 10/17 19:35
15F:推 yuetsu: mp在windows跟linux背後的實作方法不一樣 10/19 00:04
16F:→ yuetsu: linux用os.fork,記憶體在修改值之前共用(Copy on write) 10/19 00:04
17F:→ yuetsu: windows則是把變數pickle給新的process,記憶體不會共用 10/19 00:04
18F:→ yuetsu: 然後我發現我講的東西跟這篇文章一點關係都沒有 10/19 00:11
19F:推 billy8407: 改global變數 11/25 23:24
20F:→ billy8407: 或回傳(不能return的方式) 11/25 23:24
21F:→ billy8407: Mp有個定義share memory 變數的方式,可以去翻翻 mp的 11/25 23:26
22F:→ billy8407: document 11/25 23:26