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

问题描述 投票:2回答:1

我正在使用python3.6并尝试执行类似于以下代码的内容。然而,执行后变量mydict仍然是{}

我用global mydict和没有尝试过这个。我认为默认情况下,dicts是全局的,但似乎都不起作用。

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中的同一个字典?

python python-3.x multiprocessing global-variables python-3.6
1个回答
2
投票

可以让多个进程写入python中的同一个字典吗?

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

但是,它可以通过使用multiprocessing.Manager()来协调对某些类型的共享对象的更新来进行模拟 - 其中一种支持的类型是dict

这在在线文档的Sharing state between processes部分中讨论。使用Manager会产生大量开销,因为它们作为单独的服务器进程与您的代码创建的任何其他进程并行运行。

无论如何,这是一个基于您的问题中的代码的工作示例,该代码使用一个来管理共享字典的并发更新。因为TEST()函数所做的事情是如此微不足道,所以很可能以这种方式执行它比不使用multiprocessing要慢,因为它需要额外的开销 - 但是这样的事情可能更适合更多计算密集的任务。

from contextlib import closing
from multiprocessing import Pool, Manager

def TEST(mydict, hello, integer):
    mydict[integer] = hello
    print(integer)

if __name__ == '__main__':

    with Manager() as manager:
        my_dict = manager.dict()

        with closing(Pool(processes=4)) as pool:
            pool.starmap(TEST, ((my_dict, 'Hello World', i) for i in range(200)))
© www.soinside.com 2019 - 2024. All rights reserved.