为了账号安全,请及时绑定邮箱和手机立即绑定

Python 同时填充一个列表

Python 同时填充一个列表

温温酱 2021-06-06 15:34:10
因此,我正在尝试编写多进程代码,希望能够根据正在运行的某些进程填充列表。但它根本没有修改列表。现在我知道我不能访问同一个元素并从多个线程增加它,因为它会导致竞争条件。但我所拥有的是从 ONE 和只有一个进程访问 ONE 索引的代码。例如,如果我有一个包含 4 个元素的列表,我会运行 4 个进程,每个元素一个进程。然而,这行不通。即使我读到列表应该是线程安全的。我写了一个小程序来演示我的问题:from multiprocessing import Processlist = [0,0,0,0]def incrAt(idx):    list[idx] += 1p0 =  Process(target = incrAt, args=(0,))p1 =  Process(target = incrAt, args=(1,))p2 =  Process(target = incrAt, args=(2,))p3 =  Process(target = incrAt, args=(3,))p0.start()p1.start()p2.start()p3.start()# Do stuff while we wait...p0.join()p1.join()p2.join()p3.join()print(list) # should print [1,1,1,1] but prints [0,0,0,0]
查看完整描述

1 回答

?
精慕HU

TA贡献1845条经验 获得超8个赞

那是因为全局变量不在进程之间共享。


使用multiprocessing.Manager.list -


from multiprocessing import Process, Manager


def incrAt(idx, lis):

    lis[idx] += 1

with Manager() as manager:

    lis = manager.list([0, 0, 0, 0])

    p0 =  Process(target = incrAt, args=(0,lis))

将您的列表从 list 重命名为 lis 因为列表是 python 的内置


查看完整回答
反对 回复 2021-06-09
  • 1 回答
  • 0 关注
  • 140 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号