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.starmap
metodo, 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 Pool
in 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.
partial
nélambda
fare né fare questo. Penso che abbia a che fare con lo strano modo in cui le funzioni vengono passate ai sottoprocessi (viapickle
).