python - 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:
我认为这与字典作为参数传递的方式有关,因为上述错误总是将字典中的项目数列为传递的位置参数的数量,就好像传递的是键字典而不是字典本身。当我在调试器中进入代码时,这正是正在发生的事情,即如果字典参数中有一个项目,那么只有键被传递给初始化函数,而不是字典本身。
如果字典中有多个项目用作传递给初始化函数的参数,则会显示上述错误消息,将字典中的项目数报告为给定的位置参数数,因此它以某种方式传递了字典作为参数,而不是字典本身。
我在这里做错了什么?
解决方案
如果您查看此处的文档
您将看到以下内容:
If initializer is not None then each worker process will
call initializer(*initargs) when it starts.
如您所见,操作员initializer
正在解包函数的参数*
。
因此,您的自定义 init 函数应该准备好接受多个参数,以防您将一个包含多个元素的 dict 传递给它,否则它将失败。
像这样的东西:def _init_worker(*shared_arrays)
推荐阅读
- swift - 如何使用新的 Swift 结构化并发启动后台任务?
- python - 在 docker 容器中构建 dlib 失败
- sql-server - 复制两个独立数据库中某些表的更改
- kubernetes - 虚拟服务端口配置适用于一个命名空间,但不适用于另一个
- regex - 通过派生规则查找正则表达式的语言
- x86-64 - 4KB 页面大小的 48 位系统中的虚拟页号有多长
- r - 等到值改变进行计算
- c - 当我输入第一个站的输入时,它最接近它打印最小值为 0 而不是 1 为什么会发生这种情况?所有其他事情都正常工作
- mongodb - 使用 mongo 的 UserUpdate 获取公会 ID
- node.js - Amazon S3 在使用 generatePresignedPutUrl 时返回拒绝访问