gpt4 book ai didi

具有全局数据的python并行映射(multiprocessing.Pool.map)

转载 作者:太空狗 更新时间:2023-10-29 17:58:13 27 4
gpt4 key购买 nike

我正在尝试在多个进程上调用一个函数。显而易见的解决方案是 python 的 multiprocessing 模块。问题是该功能有副作用。它创建一个临时文件并使用 atexit.register 和全局列表注册要在退出时删除的文件。以下应证明问题(在不同的上下文中)。

import multiprocessing as multi

glob_data=[]
def func(a):
glob_data.append(a)

map(func,range(10))
print glob_data #[0,1,2,3,4 ... , 9] Good.

p=multi.Pool(processes=8)
p.map(func,range(80))

print glob_data #[0,1,2,3,4, ... , 9] Bad, glob_data wasn't updated.

有什么办法可以更新全局数据吗?

请注意,如果您尝试上面的脚本,您可能不应该从交互式解释器中尝试它,因为 multiprocessing 要求模块 __main__ 可以被子进程导入.

更新

在 func 中添加 global 关键字没有帮助——例如:

def func(a):  #Still doesn't work.
global glob_data
glob_data.append(a)

最佳答案

您需要列表 glob_data 由共享内存支持,Multiprocessing 的管理器为您提供:

import multiprocessing as multi
from multiprocessing import Manager

manager = Manager()

glob_data = manager.list([])

def func(a):
glob_data.append(a)

map(func,range(10))
print glob_data # [0,1,2,3,4 ... , 9] Good.

p = multi.Pool(processes=8)
p.map(func,range(80))

print glob_data # Super Good.

一些背景:

https://docs.python.org/3/library/multiprocessing.html#managers

关于具有全局数据的python并行映射(multiprocessing.Pool.map),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9911819/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com