我有以下问题。我编写了一个函数,它将列表作为输入,并为列表中的每个元素创建一个字典。然后我想把这本词典附加到一个新的列表中,这样我就得到了一个词典列表。我正在尝试为此生成多个进程。这里的问题是,我希望不同的进程访问字典列表,因为它是由其他进程更新的,例如,在达到某个长度后打印某个内容。
我的例子如下:
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):
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(可能是插座)。关于python - 在python中的不同进程之间共享一个列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40630428/