将不同的参数传递给python中的ThreadPool.apply_async()方法

时间:2019-06-12 11:56:25

标签: python multithreading arguments threadpool pool

我想将不同的参数传递给ThreadPool.apply_async()方法。我该怎么办?我以为是通过以下方式完成的,但是我错了。 我可以改用Thread吗? 预先谢谢你

#!/usr/bin/env python
import multiprocessing

def testMethod(arg1, arg2, arg3):
    print(f"{arg1} - {arg2} - {arg3}"

if __name__ == '__main__':
    pool = multiprocessing.Pool()
    for t in range(1000):
        pool.apply_async(testMethod, t, arg2, arg3)

1 个答案:

答案 0 :(得分:0)

typeshed中方法签名上的类型提示表明,必须以可迭代方式提供位置参数:

def apply_async(self,
                func: (...) -> _T,
                args: Iterable = ...,
                kwds: Mapping[str, Any] = ...,
                callback: Optional[(_T) -> None] = ...,
                error_callback: Optional[(BaseException) -> None] = ...)

您对apply_async的呼叫应如下所示:

pool.apply_async(testMethod, args=(t, 'foo', 'bar'))

或者,使用关键字参数映射:

pool.apply_async(testMethod, kwds={'arg1': t, 'arg2': 'foo', 'arg3': 'bar'})

顺便说一句:您的代码示例不使用线程池; multiprocessing.Pool是一个代表进程池的类,即,它创建了单独的进程来充当工作进程。
如果要使用线程池,请执行以下操作:

from multiprocessing.pool import ThreadPool
pool = ThreadPool()

该接口类似于进程池的接口。