首页 > 解决方案 > Python(多处理):如何将字典作为工作进程初始化函数的参数传递?

问题描述

我正在使用一个函数来初始化进程池的工作进程,这个函数有一个参数,它是一个字典。当创建进程池并调用函数来初始化每个工作进程时,我收到有关错误数量参数的错误:

TypeError: _init_worker() takes 1 positional argument but 2 were given

正在使用的进程初始化函数:

def _init_worker(shared_arrays):

    _global_shared_arrays = shared_arrays

每个工作进程都以正常方式调用初始化程序:

with multiprocessing.Pool(processes=_NUMBER_OF_WORKER_PROCESSES,
                          initializer=_init_worker, initargs=(arrays_dict)) as pool:

我认为这与字典作为参数传递的方式有关,因为上述错误总是将字典中的项目数列为传递的位置参数的数量,就好像传递的是键字典而不是字典本身。当我在调试器中进入代码时,这正是正在发生的事情,即如果字典参数中有一个项目,那么只有键被传递给初始化函数,而不是字典本身。

如果字典中有多个项目用作传递给初始化函数的参数,则会显示上述错误消息,将字典中的项目数报告为给定的位置参数数,因此它以某种方式传递了字典作为参数,而不是字典本身。

我在这里做错了什么?

标签: pythonpython-multiprocessing

解决方案


如果您查看此处的文档

您将看到以下内容:

If initializer is not None then each worker process will   
call initializer(*initargs) when it starts.  

如您所见,操作员initializer正在解包函数的参数*
因此,您的自定义 init 函数应该准备好接受多个参数,以防您将一个包含多个元素的 dict 传递给它,否则它将失败。
像这样的东西:def _init_worker(*shared_arrays)


推荐阅读