作者hanksky (鲁蛇一枚)
看板Python
标题[问题] 多进程 与 参数字典资料异常问题?
时间Wed May 26 12:18:54 2021
想请问各位大大,小弟在跑多进程使用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之後再去
印出来也没问题,请问为什麽?
'''
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 114.33.45.92 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Python/M.1622002737.A.AA1.html
1F:→ fiorentino: int, float, boolean都是传值,set, list, dict都是传 05/26 12:58
2F:→ fiorentino: 址 05/26 12:58
3F:→ hanksky: 请问为何传址的字典经过一个函数,值就不会跑掉? 05/26 13:14
4F:推 lycantrope: 你在run async丢字典进去同时字典内i已经被下个i更新 05/26 13:30
7F:推 lycantrope: 你可以check id会发现dict1都是同一个,但dict2不同 05/26 16:24
8F:→ hanksky: 谢谢,原来是在回圈内每次都是新的字典,所以没影响,外 05/27 12:12
9F:→ hanksky: 面的字典都是同一个,所以值才会一直改变,加上字典传址 05/27 12:13
10F:→ hanksky: 所以才造成这种现象吧? 05/27 12:13
11F:推 lycantrope: 对,但我发现async内task的id又跟原本的不同 05/27 16:06
12F:→ lycantrope: 虽然传址,但中间dict1还是得复制到pool做运算 05/27 16:07