Python(多处理):如何将字典作为工作进程初始化函数的参数传递?

时间:2018-11-19 14:44:29

标签: python python-multiprocessing

我正在使用一个函数来初始化进程池的工作进程,并且该函数具有单个参数,即字典。创建进程池并调用函数以初始化每个工作进程时,我会收到有关参数数量错误的错误:

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:

我认为这与字典作为参数的传递方式有关,因为上面的错误始终将字典中的项目数列为所传递的位置参数的数目,就好像传递的是字典的键,而不是字典本身。当我进入调试器中的代码时,这就是正在发生的事情,即,如果字典参数中只有一个项目,那么只有键会传递给初始化函数,而不是字典本身。如果字典中有多个项目用作传递给初始化函数的参数,则会显示上述错误消息,将字典中的项目数报告为给定的位置参数的数量,因此它将以某种方式传递字典作为参数而不是字典本身。

有人在这里看到我在做什么错吗?预先感谢您的建议。

2 个答案:

答案 0 :(得分:1)

如果您查看文档here

您将看到以下内容:

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

您可以看到initializer操作符正在解压缩*函数的args。
因此,自定义的init函数应该准备好接受多个参数,以防您将包含多个元素的字典传递给它,否则它将失败。
像这样的东西:def _init_worker(*shared_arrays)

答案 1 :(得分:0)

initargs将被解压缩,因此您必须传递一个元组,例如

tearDown