为什么 multiprocessing.Pool 不能改变全局变量?

meT*_*sky 1 python multiprocessing

我想用来multiprocessing.Pool加载大型数据集,这是我正在使用的代码:

import os
from os import listdir
import pickle
from os.path import join
import multiprocessing as mp

db_path = db_path
the_files = listdir(db_path)
fp_dict = {}
def loader(the_hash):
        global fp_dict
        the_file = join(db_path, the_hash)
        with open(the_file, 'rb') as source:
                fp_dict[the_hash] = pickle.load(source)
        print(len(fp_dict))
def parallel(the_func, the_args):
        global fp_dict
        pool = mp.Pool(mp.cpu_count())
        pool.map(the_func, the_args)
        print(len(fp_dict))
parallel(loader, the_files)
Run Code Online (Sandbox Code Playgroud)

有趣的fp_dict是,当代码运行时, 的长度会发生变化。但是,只要进程终止,长度fp_dict就为零。为什么?如何使用 修改全局变量multiprocessing.Pool

ste*_*eha 6

因为你正在使用multiprocessing.Pool你的程序在多个进程中运行。每个进程都有自己的全局变量副本,每个进程修改自己的全局变量副本,当工作完成时,每个进程终止。主进程从未修改其全局变量的副本。

如果您想收集有关每个工作进程内部发生的事情的信息,您应该使用 .map()方法函数,并从每个工作返回一个数据元组。然后让主人收集元组并从数据中组合一个字典。

这是一个 YouTube 教程,它演练了如何使用multiprocessing.Pool().map()从工作函数收集输出。

https://www.youtube.com/watch?v=_1ZwkCY9wxk

这是我为 StackOverflow 写的另一个答案,展示了如何传递元组以便工作函数可以接受多个参数;并展示了如何从辅助函数返回具有多个值的元组。它甚至从返回的值中制作了一个字典。

/sf/answers/771756331/