作者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/cn.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