我有以下问题。我编写了一个函数,它将列表作为输入,并为列表中的每个元素创建一个字典。然后我想将这本字典附加到一个新列表中,这样我就得到了一个字典列表。我正在尝试为此生成多个进程。我的问题是,我希望不同的进程访问由其他进程更新的字典列表,例如,一旦达到一定长度就打印一些内容。
我的例子是这样的:
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()
现在我的问题是每个进程都会创建自己的new_list
。有没有办法在进程之间共享列表,以便所有字典都附加到同一个列表中?或者是定义的唯一方法new_list
在函数之外?
一种方法是使用管理器对象并从中创建共享列表对象:
from multiprocessing import Manager, Pool
input_list = ['A', 'B', 'C', 'D', 'E', 'F']
manager = Manager()
shared_list = manager.list()
def do_stuff(element):
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
or dict
。它们在代码中的使用与内置的等效项一样容易,但在幕后使用某种形式的 IPC(可能是套接字)。
2022 年 2 月 1 日编辑:删除了不需要的global shared_list
来自函数的声明,因为对象没有被替换。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)