Odpowiedź na to pytanie zależy od wersji i sytuacji. Najbardziej ogólną odpowiedź na ostatnie wersje Pythona (od 3.3) po raz pierwszy opisano poniżej JF Sebastian . 1 Wykorzystuje Pool.starmap
metodę, która akceptuje ciąg krotek argumentów. Następnie automatycznie rozpakowuje argumenty z każdej krotki i przekazuje je do podanej funkcji:
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', ...
We wcześniejszych wersjach Pythona musisz napisać funkcję pomocnika, aby jawnie rozpakować argumenty. Jeśli chcesz użyć with
, musisz także napisać opakowanie, aby zmienić Pool
się w menedżera kontekstu. (Dzięki mion za wskazanie tego.)
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', ...
W prostszych przypadkach, ze stałym drugim argumentem, możesz także użyć partial
, ale tylko w 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. Wiele z tego zostało zainspirowanych jego odpowiedzią, która prawdopodobnie powinna była zostać zaakceptowana. Ale ponieważ ten utknął na górze, najlepszym rozwiązaniem dla przyszłych czytelników wydawało się jego ulepszenie.
partial
anilambda
zrobić. Myślę, że ma to związek z dziwnym sposobem przekazywania funkcji do podprocesów (viapickle
).