因此,我正在尝试编写多进程代码,希望这些代码可以根据正在运行的某些进程来填充列表。但这根本不是在修改列表。
现在,我知道我无法访问相同的元素并无法从多个线程中对其进行递增,因为这将导致竞争状况。但是我所拥有的是从一个而且只有一个进程访问一个索引的代码。这样,例如,如果我有一个包含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]
答案 0 :(得分:3)
这是因为全局变量不在进程之间共享。
使用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))
将列表从列表重命名为lis,因为列表是python内置的