You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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。

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 13:30:01