#!/usr/bin/env python3 from functools import partial from itertools import repeat from multiprocessing import Pool, freeze_support
deffunc(a, b): return a + b
defmain(): a_args = [1,2,3] second_arg = 1 with Pool() as pool: L = pool.starmap(func, [(1, 1), (2, 1), (3, 1)]) M = pool.starmap(func, zip(a_args, repeat(second_arg))) N = pool.map(partial(func, b=second_arg), a_args) assert L == M == N
if __name__=="__main__": freeze_support() main()
Для более старых версий:
#!/usr/bin/env python2 import itertools from multiprocessing import Pool, freeze_support
deffunc(a, b): print a, b
deffunc_star(a_b): """Convert `f([1,2])` to `f(1,2)` call.""" return func(*a_b)
Ответ на этот вопрос зависит от версии и конкретной ситуации. Наиболее общий ответ для последних версий Python (начиная с 3.3) был впервые описан ниже Дж.Ф. Себастьяном.1 Он использует Pool.starmap метод, который принимает последовательность кортежей аргументов. Затем он автоматически распаковывает аргументы из каждого кортежа и передает их данной функции:
import multiprocessing from itertools import product
defmerge_names(a, b): return'{} & {}'.format(a, b)
if __name__ == '__main__': names = ['Brown', 'Wilson', 'Bartlett', 'Rivera', 'Molloy', 'Opie'] with multiprocessing.Pool(processes=3) as pool: results = pool.starmap(merge_names, product(names, repeat=2)) print(results)
Для более ранних версий Python вам нужно будет написать вспомогательную функцию для явного распаковывания аргументов. Если вы хотите использовать with, вам также нужно будет написать оболочку для превращения Pool в контекстный менеджер. (Спасибо muon за указание на это.)
import multiprocessing from itertools import product from contextlib import contextmanager
defmerge_names(a, b): return'{} & {}'.format(a, b)
1. Многое из этого было вдохновлено его ответом, который, вероятно, следовало принять вместо этого. Но поскольку этот застрял вверху, казалось, что лучше всего улучшить его для будущих читателей.
Ответ 3
Я думаю, что ниже будет лучше:
defmulti_run_wrapper(args): return add(*args)
defadd(x,y): return x+y
if __name__ == "__main__": from multiprocessing import Pool with Pool(4) as pool: results = pool.map(multi_run_wrapper,[(1,2),(2,3),(3,4)]) print results
Вывод
[3, 5, 7]
Ответ 4
Использование Python 3.3+ с pool.starmap():
from multiprocessing.dummy import Pool as ThreadPool
defwrite_func(i, x): print(i, "---", x)
a = ["1","2","3"] b = ["4","5","6"]
pool = ThreadPool(2) pool.starmap(write_func, zip(a,b)) pool.close() pool.join()
Результат:
1 --- 4 2 --- 5 3 --- 6
Вы также можете использовать zip() с дополнительными аргументами, если хотите: zip(a,b,c,d,e)
На случай, если вы хотите, чтобы в качестве аргумента передавалось постоянное значение:
import itertools
zip(itertools.repeat(constant), a)
На случай, если ваша функция должна вернуть что-то: