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

看板Python作者 (妳,好不好)時間3年前 (2020/10/16 17:11), 編輯推噓3(3015)
留言18則, 5人參與, 3年前最新討論串1/1
各位先進達人好, 請問在測試以下程式碼為何結果無效? 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

10/16 17:45, 3年前 , 1F
因為你用multiprocess記憶體不是共用的
10/16 17:45, 1F

10/16 17:48, 3年前 , 2F
你是在什麼環境跑的 我跑結果怎麼和你不一樣
10/16 17:48, 2F

10/16 17:50, 3年前 , 3F
謝謝IAMPF 大回答,請問有建議改良方法嗎?感恩
10/16 17:50, 3F

10/16 17:51, 3年前 , 4F
回T大,我在jupyter nb上執行,跟環境有關嗎?
10/16 17:51, 4F

10/16 17:55, 3年前 , 5F
這應該是官方的範例改過來的 照理說d應該會變才對
10/16 17:55, 5F

10/16 17:55, 3年前 , 6F

10/16 17:56, 3年前 , 7F
剛試著換shell執行,好像真的不一樣,是nb不適合測試multi
10/16 17:56, 7F

10/16 17:56, 3年前 , 8F
processing?
10/16 17:56, 8F

10/16 17:56, 3年前 , 9F
有沒有可能是jupyter函式定義的區段沒執行到
10/16 17:56, 9F

10/16 17:57, 3年前 , 10F
謝謝T大,原來程式碼是沒問題的,我再研究看看是否跟nb環
10/16 17:57, 10F

10/16 17:57, 3年前 , 11F
境有關,謝謝
10/16 17:57, 11F

10/17 19:35, 3年前 , 12F
印象中mp會各自clone一份引用的資料,如果要對share
10/17 19:35, 12F

10/17 19:35, 3年前 , 13F
resource進行處理印象中要用shareable data type
10/17 19:35, 13F

10/17 19:36, 3年前 , 14F
這可能有關https://bit.ly/3k7mFZh
10/17 19:36, 14F

10/19 00:04, 3年前 , 15F
mp在windows跟linux背後的實作方法不一樣
10/19 00:04, 15F

10/19 00:04, 3年前 , 16F
linux用os.fork,記憶體在修改值之前共用(Copy on write)
10/19 00:04, 16F

10/19 00:04, 3年前 , 17F
windows則是把變數pickle給新的process,記憶體不會共用
10/19 00:04, 17F

10/19 00:11, 3年前 , 18F
然後我發現我講的東西跟這篇文章一點關係都沒有
10/19 00:11, 18F
文章代碼(AID): #1VYMEaY4 (Python)