Python 在不同进程之间共享列表?

Python 在不同进程之间共享列表?,python,list,multiprocessing,Python,List,Multiprocessing,我有以下问题。我编写了一个函数,该函数将列表作为输入,并为列表中的每个元素创建一个字典。然后我想把这本字典附加到一个新的列表中,这样我就得到了一个字典列表。我正在尝试为此生成多个进程。我这里的问题是,我希望不同的进程在字典列表被其他进程更新时访问字典列表,例如,一旦字典列表达到某个长度,就打印它 我的例子如下: import multiprocessing list=['A', 'B', 'C', 'D', 'E', 'F'] def do_stuff(element): eleme

我有以下问题。我编写了一个函数,该函数将列表作为输入,并为列表中的每个元素创建一个字典。然后我想把这本字典附加到一个新的列表中,这样我就得到了一个字典列表。我正在尝试为此生成多个进程。我这里的问题是,我希望不同的进程在字典列表被其他进程更新时访问字典列表,例如,一旦字典列表达到某个长度,就打印它

我的例子如下:

import multiprocessing

list=['A', 'B', 'C', 'D', 'E', 'F']

def do_stuff(element):
    element_dict={}
    element_dict['name']=element
    new_list=[]
    new_list.append(element_dict)
    if len(new_list)>3:
        print 'list > 3'

###Main###
pool=multiprocessing.Pool(processes=6)
pool.map(do_stuff, list)
pool.close()

现在我的问题是每个进程都会创建自己的
新列表
。是否有一种方法可以在进程之间共享该列表,以便将所有词典附加到同一个列表中?或者是在函数之外定义
新列表的唯一方法?

一种方法是使用管理器对象并从中创建共享列表对象:

from multiprocessing import Manager, Pool

input_list = ['A', 'B', 'C', 'D', 'E', 'F']

manager = Manager()
shared_list = manager.list()

def do_stuff(element):
    global shared_list
    element_dict = {}
    element_dict['name'] = element
    shared_list.append(element_dict)
    if len(shared_list) > 3:
        print('list > 3')

pool = Pool(processes=6)
pool.map(do_stuff, input_list)
pool.close()
请记住,与线程不同,进程不共享内存空间。(生成时,每个进程都会获得生成进程内存占用的副本,然后与之一起运行。)因此它们只能通过某种形式的IPC(进程间通信)进行通信。在Python中,一种这样的方法是
multiprocessing.Manager
及其公开的数据结构,例如
list
dict
。它们在代码中的使用与它们的内置等价物一样简单,但在引擎盖下使用某种形式的IPC(可能是插座)。

以下内容来自:

从多处理导入共享内存
a=共享的内存.ShareableList(['howdy',b'howdy',-273.154100,None,True,42])
[输入(条目)用于a中的条目]
[, , , ]
a[2]
-273.154
a[2]=-78.5
a[2]
-78.5
还支持[2]=“干冰”#更改数据类型
a[2]
“干冰”
a[2]=“大于先前分配的存储空间”
回溯(最近一次呼叫最后一次):
...
ValueError:超出现有str的可用存储空间
a[2]
“干冰”
len(a)
7.
a、 索引(42)
6.
a、 伯爵(你好)
0
a、 伯爵(你好)
1.
a、 shm.close()
a、 shm.unlink()
dela#不支持在调用unlink()后使用ShareableList

使用.或谢谢!我已经尝试放入一个管理器对象,但没有真正让它工作……这在windows上不起作用,因为每个进程都有自己的
shared\u列表
,因此列表不会被共享。这也是一种“叉形炸弹”“因为每个进程创建自己的
并启动6个其他进程,这些进程也创建自己的
对象,并启动6个其他进程,这些进程也…
全局
无论如何都是一个坏主意,但在这里它确实是错误的。
共享列表
需要在函数中是局部的,该函数具有只需在主程序中调用,而不在模块的导入中调用,列表必须以“<代码> doyScript())/<代码>作为参数。请考虑使用所提供的空间来说明为什么您的答案有效。
from multiprocessing import shared_memory
a = shared_memory.ShareableList(['howdy', b'HoWdY', -273.154, 100, None, True, 42])
[ type(entry) for entry in a ]
[<class 'str'>, <class 'bytes'>, <class 'float'>, <class 'int'>, <class 'NoneType'>, <class 'bool'>, <class 'int'>]
a[2]
-273.154
a[2] = -78.5
a[2]
-78.5
a[2] = 'dry ice'  # Changing data types is supported as well
a[2]
'dry ice'
a[2] = 'larger than previously allocated storage space'
Traceback (most recent call last):
  ...
ValueError: exceeds available storage for existing str
a[2]
'dry ice'
len(a)
7
a.index(42)
6
a.count(b'howdy')
0
a.count(b'HoWdY')
1
a.shm.close()
a.shm.unlink()
del a  # Use of a ShareableList after call to unlink() is unsupported