【问题标题】:Why multiprocessing.Pool cannot change global variable?为什么 multiprocessing.Pool 不能更改全局变量?
【发布时间】:2018-12-21 02:43:56
【问题描述】:

我想使用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)

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

【问题讨论】:

标签: python multiprocessing


【解决方案1】:

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

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

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

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

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

https://stackoverflow.com/a/11025090/166949

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多