Python 同时填充列表

标签 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]

最佳答案

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

使用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 内置的

关于Python 同时填充列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52158549/

相关文章:

python - tkinter 标签在一段时间后消失

python - 如何使用存储在另一个数组中的索引访问数组中的行?

Java并发: safe publication of array

java - 通过具体(Java)示例进行乐观锁定

python - Python 的 HTML 调试 pretty-print

python - 狮身人面像 : force rebuild of html, 包括 autodoc

python - numpy 插值以增加数组大小

python - 如何使用 lxml 迭代 GraphML 文件

Python abstract property() "Can' t 用抽象方法实例化抽象类 []”,但我做到了

java - ConcurrentHashMap 的实际用例