Bunun cevabı versiyona ve duruma bağlıdır. Python'un son sürümleri (3.3'ten beri) için en genel cevap ilk olarak aşağıda JF Sebastian tarafından açıklandı . 1Pool.starmap
Bir dizi argüman tuplesini kabul eden yöntemi kullanır . Daha sonra, argümanları her bir gruptan otomatik olarak açar ve verilen işleve iletir:
import multiprocessing
from itertools import product
def merge_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)
# Output: ['Brown & Brown', 'Brown & Wilson', 'Brown & Bartlett', ...
Python'un önceki sürümlerinde, bağımsız değişkenleri açıkça açmak için bir yardımcı işlev yazmanız gerekir. Kullanmak isterseniz with
, Pool
içerik yöneticisine dönüştürmek için bir sarıcı yazmanız gerekir . ( Bunu işaret ettiği için müon için teşekkürler .)
import multiprocessing
from itertools import product
from contextlib import contextmanager
def merge_names(a, b):
return '{} & {}'.format(a, b)
def merge_names_unpack(args):
return merge_names(*args)
@contextmanager
def poolcontext(*args, **kwargs):
pool = multiprocessing.Pool(*args, **kwargs)
yield pool
pool.terminate()
if __name__ == '__main__':
names = ['Brown', 'Wilson', 'Bartlett', 'Rivera', 'Molloy', 'Opie']
with poolcontext(processes=3) as pool:
results = pool.map(merge_names_unpack, product(names, repeat=2))
print(results)
# Output: ['Brown & Brown', 'Brown & Wilson', 'Brown & Bartlett', ...
Daha basit durumlarda, sabit bir ikinci argümanla, partial
sadece Python 2.7+ ' da da kullanabilirsiniz .
import multiprocessing
from functools import partial
from contextlib import contextmanager
@contextmanager
def poolcontext(*args, **kwargs):
pool = multiprocessing.Pool(*args, **kwargs)
yield pool
pool.terminate()
def merge_names(a, b):
return '{} & {}'.format(a, b)
if __name__ == '__main__':
names = ['Brown', 'Wilson', 'Bartlett', 'Rivera', 'Molloy', 'Opie']
with poolcontext(processes=3) as pool:
results = pool.map(partial(merge_names, b='Sons'), names)
print(results)
# Output: ['Brown & Sons', 'Wilson & Sons', 'Bartlett & Sons', ...
1. Bunun çoğu, muhtemelen onun yerine kabul edilmesi gereken cevabından esinlenmiştir. Ancak bu en üstte kaldığından, gelecekteki okuyucular için onu iyileştirmek en iyisi gibi görünüyordu.
partial
delambda
yapabilirdim. Bence bu fonksiyonların alt süreçlere aktarılması (garip) ile garip bir yolla ilgilipickle
.