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