是否可以使多个进程使用Pool.map()写入同一词典?

时间:2019-03-05 23:39:20

标签: python python-3.x multiprocessing global-variables python-3.6

我正在使用python3.6,并试图执行类似于以下代码的操作。但是,执行后,变量mydict仍为{}

我已经尝试过使用global mydict,而没有使用。我认为默认情况下,字典是全局的,但似乎都不起作用。

mydict = {}
def TEST(hello, integer):
    global mydict
    mydict[integer] = hello
    print(integer)
with closing(Pool(processes=4)) as pool:
    pool.starmap(TEST, [['Hello World', i] for i in range(200)])

是否可以让多个进程在python中的同一个字典中写入内容?

1 个答案:

答案 0 :(得分:2)

  

是否可以让多个进程在python中写入同一词典?

否,这不是在进程之间共享字典,因为每个字典都在单独的内存空间中运行,并且所涉及的Python代码由解释器的不同副本进行解释,尽管可以通过共享内存来完成某些其他数据类型的操作。

但是,可以通过使用multiprocessing.Manager()来协调对某些类型的共享库的更新进行模拟,并且受支持的类型之一是 df1 A B x y 0 10 Z1 106 375 1 11 Z1 111 459 2 10 Z1 109 379

在在线文档的Sharing state between processes部分中对此进行了讨论。使用 df2 A B x y 1 11 Z1 111 459 2 10 Z1 109 379 会带来很多开销,因为它们作为单独的服务器进程与您的代码创建的任何其他进程并行运行。

无论如何,这是一个基于您问题中代码的工作示例,该示例使用一个代码来管理对共享字典的并发更新。由于 df2 = df1.drop_duplicates(subset=['A','B'], keep='last') 函数的作用如此微不足道,因此,由于所有额外的开销,以这种方式执行此操作很可能比使用dict not 慢。它必然会—但是类似的事情可能更适合计算量大的任务。

Manager