在multiprocessing.Process对象中字典解包出现意外表达式错误如何解决?
错误原因
multiprocessing.Process对参数传递有明确规则:args仅接收位置参数组成的元组,关键字参数需要单独传入kwargs参数,不支持在args元组内直接做 ** 字典解包,你写的args=(**partial_fun_params, list_pieces[i])属于Python语法错误,** 解包不能直接放在元组字面量中,解释器无法识别所以抛出"unexpected expression"报错。- 仅用 * 解包字典时,Python默认迭代字典的键,所以只会传入键名,符合你观察到的现象。
需求合理性
你要把参数字典解包传入多进程目标函数的需求完全合理,属于多进程批量传参的常见场景,按照Process的参数规则调整写法即可修复。
修复方案
推荐两种兼容性好的实现方式:
方案1:拆分位置参数和关键字参数
将字典参数通过 kwargs 传递,额外的分片参数可以合并到参数字典中:
import numpy as np import multiprocessing as mp class sample: def sample_proc_fun(self, arg1, arg2, arg3, piece_of_list): pass def parallel_ticker_workload(self, partial_fun_params, list_raw_file_names, n_core): # shuffle to distribute file sizes evenly list_pieces = np.array_split(list_raw_file_names, n_core) processes = [] for i in range(n_core): # 合并参数到字典,走kwargs传递 proc_kwargs = partial_fun_params.copy() proc_kwargs["piece_of_list"] = list_pieces[i] p = mp.Process( target=self.sample_proc_fun, kwargs=proc_kwargs ) p.daemon = True # 主程序退出时自动销毁子进程 processes.append(p) [x.start() for x in processes] [x.join() for x in processes]
方案2:用偏函数预绑定参数
如果不想修改原有参数结构,可以用functools.partial提前绑定字典中的固定参数,剩余的分片参数走args传递:
from functools import partial import numpy as np import multiprocessing as mp class sample: def sample_proc_fun(self, arg1, arg2, arg3, piece_of_list): pass def parallel_ticker_workload(self, partial_fun_params, list_raw_file_names, n_core): # 预绑定固定参数 bound_func = partial(self.sample_proc_fun, **partial_fun_params) # shuffle to distribute file sizes evenly list_pieces = np.array_split(list_raw_file_names, n_core) processes = [] for i in range(n_core): p = mp.Process( target=bound_func, args=(list_pieces[i],) ) p.daemon = True # 主程序退出时自动销毁子进程 processes.append(p) [x.start() for x in processes] [x.join() for x in processes]
内容的提问来源于stack exchange,提问作者Egor。
相关产品推荐
相关产品推荐

