Передайте различные аргументы методу ThreadPool.apply_async () в python - PullRequest
0 голосов
/ 12 июня 2019

Я хочу передать разные аргументы методу ThreadPool.apply_async ().Как я могу это сделать?Я думал, что это было сделано следующим образом, но я был неправ.Могу ли я использовать нить вместо?Заранее спасибо

#!/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 голосов
/ 13 июня 2019

Подсказки типов в сигнатуре метода в typhed показывают, что позиционные аргументы должны быть предоставлены как итерируемые:

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()

Интерфейс похож на интерфейс пула процессов.

...