在python中的不同进程之间共享一个列表

seq*_*ard 9 python list multiprocessing

我有以下问题.我编写了一个函数,它将列表作为输入,并为列表中的每个元素创建一个字典.然后我想将这个字典附加到一个新列表,所以我得到一个字典列表.我正在尝试为此生成多个进程.我的问题在于我希望不同的进程访问字典列表,因为它由其他进程更新,例如在达到一定长度后打印一些东西.我的例子是这样的:

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()
Run Code Online (Sandbox Code Playgroud)

现在我的问题是每个进程都创建了自己的进程new_list.有没有办法在进程之间共享列表,以便所有字典都附加到同一个列表中?或者是定义new_list函数外部的唯一方法?

Vel*_*ker 16

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

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()
Run Code Online (Sandbox Code Playgroud)

请记住,与线程不同,进程不共享内存空间.(当产生时,每个进程都会获得自己的产生进程内存占用副本,然后随之运行.)因此,它们只能通过某种形式的IPC(进程间通信)进行通信.在Python中,一种这样的方法是multiprocessing.Manager它暴露的数据结构,例如listdict.这些在代码中使用就像它们的内置等价物一样容易,但在引擎盖下使用某种形式的IPC(可能是套接字).

  • 无论如何,“global”是一个坏主意,但在这里它确实是错误的。`shared_list` 和 `pool` 需要在函数中是本地的,必须保护该函数仅在主程序中调用,而不是在导入模块时调用,并且列表必须作为 `do_stuff() 的参数给出`。 (2认同)