[问题] 多进程 与 参数字典资料异常问题?

楼主: hanksky (鲁蛇一枚)   2021-05-26 12:18:54
想请问各位大大,小弟在跑多进程使用pool时候,遇到参数进到子进程之后,会出现
更后面才可能出现的参数,参数在不同循环都不同,所以用i来替代,下面是简化过的
程式,里面的code可执行,总共有4个问题想请教
https://replit.com/@bqt978/123#main.py
from multiprocessing import Pool
def task(i,dict1,dict2):
print("in 正确值 %s | dict2值 %s| dict1值i1 %s| dict1值i2
%s"%(i,dict2["i"],dict1["i1"],dict1["i2"]))
def fun(i):
dict2 = {}
dict2["i"] = str(i)
return dict2
if __name__=='__main__':
dict1 = {}
p = Pool(4)
for i in range(500):
dict2 = fun(i)
dict1["i1"] = str(i)
dict1["i2"] = dict2["i"]
print("out 正确值 %s | dict2值 %s| dict1值i1 %s| dict1值i2
%s"%(i,dict2["i"],dict1["i1"],dict1["i2"]))
p.apply_async(task, args=(i,dict1,dict2))
print('Waiting for all subprocesses done...')
p.close()
p.join()
print('All subprocesses done.')
'''
1.请问为什么 i 当成字典的值差别在进入一个函数后赋予到字典,就能正确显示?
而直接赋予字典就会跑掉??
2.请问为什么外部值都是正确 进去task就会出错??
3.发现如果我把dict1 放到for循环内再去生成,就不会有问题,请问为什么?
4.把 dict1 的 dict1["i1"] = str(i) 和 ict1["i2"] = dict2["i"]放到task之后再去
印出来也没问题,请问为什么?
'''
作者: fiorentino (眠)   2021-05-26 12:58:00
int, float, boolean都是传值,set, list, dict都是传址
楼主: hanksky (鲁蛇一枚)   2021-05-26 13:14:00
请问为何传址的字典经过一个函数,值就不会跑掉?
作者: lycantrope (阿宽)   2021-05-26 13:30:00
你在run async丢字典进去同时字典内i已经被下个i更新
作者: lycantrope (阿宽)   2021-05-26 16:24:00
你可以check id会发现dict1都是同一个,但dict2不同
楼主: hanksky (鲁蛇一枚)   2021-05-27 12:12:00
谢谢,原来是在循环内每次都是新的字典,所以没影响,外面的字典都是同一个,所以值才会一直改变,加上字典传址所以才造成这种现象吧?
作者: lycantrope (阿宽)   2021-05-27 16:06:00
对,但我发现async内task的id又跟原本的不同虽然传址,但中间dict1还是得复制到pool做运算

Links booklink

Contact Us: admin [ a t ] ucptt.com