La risposta a questo dipende dalla versione e dalla situazione. La risposta più generale per le recenti versioni di Python (dalla 3.3) è stata descritta per la prima volta da JF Sebastian . 1 Utilizza il Pool.starmapmetodo, che accetta una sequenza di tuple di argomenti. Quindi decomprime automaticamente gli argomenti da ciascuna tupla e li passa alla funzione data:
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', ...
Per le versioni precedenti di Python, dovrai scrivere una funzione di supporto per decomprimere gli argomenti in modo esplicito. Se vuoi usare with, dovrai anche scrivere un wrapper per trasformarlo Poolin un gestore di contesto. (Grazie a muon per averlo sottolineato.)
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', ...
In casi più semplici, con un secondo argomento fisso, puoi anche usare partial, ma solo in Python 2.7+.
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. Gran parte di questo è stato ispirato dalla sua risposta, che probabilmente avrebbe dovuto essere invece accettata. Ma poiché questo è bloccato nella parte superiore, mi è sembrato meglio migliorarlo per i futuri lettori.
partialnélambdafare né fare questo. Penso che abbia a che fare con lo strano modo in cui le funzioni vengono passate ai sottoprocessi (viapickle).