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:

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

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

我在这里做错了什么?

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

initargs=(arrays_dict,)

如果您查看此处的文档

您将看到以下内容:

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

正如您所看到的,initializer函数的args正由*运算符解包
因此,您的自定义init函数应该准备好接受多个参数,以防您向它传递带有多个元素的dict,否则它将失败
类似这样的东西:def _init_worker(*shared_arrays)

最新更新