Python(多处理):如何将字典作为工作进程初始化函数的参数传递?
Python (multiprocessing): How to pass a dictionary as the argument of a worker process initializer function?
我正在使用一个函数来初始化进程池的工作进程,这个函数有一个参数,它是一个字典。创建进程池并调用函数来初始化每个工作进程时,我收到有关参数数量错误的错误消息:
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:
我认为这与字典作为参数传递的方式有关,因为上面的错误总是将字典中的项目数列为传递的位置参数的数量,就好像传递的是什么一样是字典的键而不是字典本身。当我进入调试器中的代码时,这正是正在发生的事情,即如果字典参数中只有一个项目,那么只有键被传递给初始化函数,而不是字典本身。
如果字典中有多个项目用作传递给初始化函数的参数,则会显示上述错误消息,将字典中项目的数量报告为给定的位置参数的数量,所以不知何故将字典的键作为参数而不是字典本身传递。
我做错了什么?
如果您查看文档 here
您将看到以下内容:
If initializer is not None then each worker process will
call initializer(*initargs) when it starts.
如您所见,initializer
函数的参数正在被 *
运算符解包。
因此,您的自定义 init 函数应该准备好接受多个参数,以防您向它传递一个包含多个元素的字典,否则它将失败。
像这样:def _init_worker(*shared_arrays)
initargs 将被解包,所以你必须传递一个元组,比如
initargs=(arrays_dict,)
我正在使用一个函数来初始化进程池的工作进程,这个函数有一个参数,它是一个字典。创建进程池并调用函数来初始化每个工作进程时,我收到有关参数数量错误的错误消息:
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:
我认为这与字典作为参数传递的方式有关,因为上面的错误总是将字典中的项目数列为传递的位置参数的数量,就好像传递的是什么一样是字典的键而不是字典本身。当我进入调试器中的代码时,这正是正在发生的事情,即如果字典参数中只有一个项目,那么只有键被传递给初始化函数,而不是字典本身。
如果字典中有多个项目用作传递给初始化函数的参数,则会显示上述错误消息,将字典中项目的数量报告为给定的位置参数的数量,所以不知何故将字典的键作为参数而不是字典本身传递。
我做错了什么?
如果您查看文档 here
您将看到以下内容:
If initializer is not None then each worker process will
call initializer(*initargs) when it starts.
如您所见,initializer
函数的参数正在被 *
运算符解包。
因此,您的自定义 init 函数应该准备好接受多个参数,以防您向它传递一个包含多个元素的字典,否则它将失败。
像这样:def _init_worker(*shared_arrays)
initargs 将被解包,所以你必须传递一个元组,比如
initargs=(arrays_dict,)