看板 Python 關於我們 聯絡資訊
各位先進達人好, 請問在測試以下程式碼為何結果無效? 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://www.ptt.cc/bbs/Python/M.1602839460.A.884.html
IAMPF: 因為你用multiprocess記憶體不是共用的 10/16 17:45
tsoahans: 你是在什麼環境跑的 我跑結果怎麼和你不一樣 10/16 17:48
kururu: 謝謝IAMPF 大回答,請問有建議改良方法嗎?感恩 10/16 17:50
kururu: 回T大,我在jupyter nb上執行,跟環境有關嗎? 10/16 17:51
tsoahans: 這應該是官方的範例改過來的 照理說d應該會變才對 10/16 17:55
tsoahans: https://i.imgur.com/8tiObPz.png 10/16 17:55
kururu: 剛試著換shell執行,好像真的不一樣,是nb不適合測試multi 10/16 17:56
kururu: processing? 10/16 17:56
tsoahans: 有沒有可能是jupyter函式定義的區段沒執行到 10/16 17:56
kururu: 謝謝T大,原來程式碼是沒問題的,我再研究看看是否跟nb環 10/16 17:57
kururu: 境有關,謝謝 10/16 17:57
extraymond: 印象中mp會各自clone一份引用的資料,如果要對share 10/17 19:35
extraymond: resource進行處理印象中要用shareable data type 10/17 19:35
extraymond: 這可能有關https://bit.ly/3k7mFZh 10/17 19:36
yuetsu: mp在windows跟linux背後的實作方法不一樣 10/19 00:04
yuetsu: linux用os.fork,記憶體在修改值之前共用(Copy on write) 10/19 00:04
yuetsu: windows則是把變數pickle給新的process,記憶體不會共用 10/19 00:04
yuetsu: 然後我發現我講的東西跟這篇文章一點關係都沒有 10/19 00:11
billy8407: 改global變數 11/25 23:24
billy8407: 或回傳(不能return的方式) 11/25 23:24
billy8407: Mp有個定義share memory 變數的方式,可以去翻翻 mp的 11/25 23:26
billy8407: document 11/25 23:26