如何在Python multiprocessing pool中使用关键字参数apply_async

23 投票
3 回答
14299 浏览
提问于 2025-04-17 15:29

我正在学习Python的多进程模块,特别是Pool的apply_async方法。我想调用一个带有参数和关键字参数的函数。如果我只用普通参数调用这个函数是没问题的,但当我尝试添加一个关键字参数时,就出现了这个错误:TypeError: apply_async() got an unexpected keyword argument 'arg2'。下面是我正在运行的测试代码:

#!/usr/bin/env python
import multiprocessing
from time import sleep
def test(arg1, arg2=1, arg3=2):
    sleep(5)

if __name__ == '__main__':
    pool = multiprocessing.Pool()
    for t in range(1000):
        pool.apply_async(test, t, arg2=5)
    pool.close()
    pool.join()

我该如何调用这个函数,让它能接受关键字参数呢?

3 个回答

1

Janne的回答在我用Python 2.7.11的时候没用(我也不太清楚为什么)。

这个test()函数接收到的是键(arg2),而不是值(5)。

我通过在test周围加了一个包装函数来解决这个问题:

def test2(argsDict):
    test(**argsDict)

然后调用

pool.apply_async(test2, (t,), [dict(arg2=5)])
4

原始回答:使用布尔值和多个参数的Python多进程

apply_async有两个关键字参数,分别是args和kwds,你可以这样使用:

res = p.apply_async(testFunc, args=(2, 4), kwds={'calcY': False})
28

把关键字参数放在一个字典里(把位置参数放在一个元组里):

pool.apply_async(test, (t,), dict(arg2=5))

撰写回答