多处理进程对象中的字典解包

Posted

技术标签:

【中文标题】多处理进程对象中的字典解包【英文标题】:dictionary unpacking in multiprocessing Process object 【发布时间】:2021-10-21 11:45:02 【问题描述】:

我正在尝试将参数字典解压缩到作为单独进程运行的函数中,但出现“意外表达式”错误,这让我抓狂。我正在使用“**”运算符,这给了我一个错误,但是当我只使用“*”时,它可以工作,但只会将键的名称传递给相应的参数。

我在其他问题中找不到在 *** 上遇到类似问题的人。我问的不合理吗?我该如何解决?非常感谢您的帮助。

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):
            p = mp.Process(target=self.sample_proc_fun, args=(**partial_fun_params, list_pieces[i]))
            p.daemon = True # kills this child process if the main program exits
            processes.append(p)
        [x.start() for x in processes]
        [x.join() for x in processes]

【问题讨论】:

“我正在尝试将参数字典解压缩到函数中”不,这不是你在做什么。您正在尝试使用 ** 作为元组文字的一部分,但正如错误所解释的那样,这是不允许的(因为位没有多大意义) @juanpa.arrivillaga 我现在看到“args”只接受一个参数元组,但是如何传递字典并将其内容映射到我试图创建多个进程的函数的参数的? 你能制作一个运行程序来演示问题并包含回溯消息吗? 查看我的答案,使用 kwargs 参数 【参考方案1】:

这是clearly documented,args 应该是一个元组,它将作为位置参数,传递kwargs 关键字参数的字典。 ..所以只需使用

p = mp.Process(target=self.sample_proc_fun, args=(list_pieces[i],), kwargs=partial_fun_params)

【讨论】:

啊,非常感谢!第一次和 kwargs 打交道。【参考方案2】:

你只是想要

args=partial_fun_params + (list_pieces[i],)

如果partial_fun_params 已经是一个元组。

如果partial_fun_paramslist_pieces[i] 都是字典,

args=**partial_fun_params, **list_pieces[i]

【讨论】:

我的 partial_fun_params 是一本字典。有没有办法将其保存为字典并将键映射到参数名称? 查看我的编辑。也许这就是你要找的。​​span> 不完全是,但这让我对 args 论点有了一些看法。谢谢!

以上是关于多处理进程对象中的字典解包的主要内容,如果未能解决你的问题,请参考以下文章

与多进程并行读取数据

python中的多处理-在多个进程之间共享大对象(例如pandas数据框)

python多进程报错load_eof

用于多处理同步的类似队列的对象

python加快数据处理的方法

Gunicorn 在多处理进程和工作进程之间共享内存