Python同时填充lis

2024-10-02 20:41:18 发布

您现在位置:Python中文网/ 问答频道 /正文

因此,我正在尝试编写多进程代码,希望能够根据正在运行的一些进程填充一个列表。但这根本不是在修改名单。你知道吗

现在我知道我不能访问同一个元素并从多个线程中递增它,因为这将导致竞争条件。但我拥有的代码只能从一个进程访问一个索引。例如,如果我有一个包含4个元素的列表,我运行4个进程,每个元素一个进程。然而,这是行不通的。尽管我读到了列表应该是线程安全的。你知道吗

我写了一个小程序来演示我的问题:

from multiprocessing import Process

list = [0,0,0,0]

def incrAt(idx):
    list[idx] += 1


p0 =  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]

Tags: 代码元素target列表进程argsprocessstart
1条回答
网友
1楼 · 发布于 2024-10-02 20:41:18

这是因为全局变量不在进程之间共享。你知道吗

使用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,因为list是python内置的

相关问题 更多 >