[问题] 测试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