Python同时填写列表

时间:2018-09-04 03:50:32

标签: python python-3.x concurrency multiprocessing

因此,我正在尝试编写多进程代码,希望这些代码可以根据正在运行的某些进程来填充列表。但这根本不是在修改列表。

现在,我知道我无法访问相同的元素并无法从多个线程中对其进行递增,因为这将导致竞争状况。但是我所拥有的是从一个而且只有一个进程访问一个索引的代码。这样,例如,如果我有一个包含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]

1 个答案:

答案 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内置的