Die Antwort darauf ist version- und situationsabhängig. Die allgemeinste Antwort für neuere Versionen von Python (seit 3.3) wurde unten von JF Sebastian beschrieben . 1 Es wird die Pool.starmap
Methode verwendet, die eine Folge von Argumenttupeln akzeptiert. Anschließend werden die Argumente aus jedem Tupel automatisch entpackt und an die angegebene Funktion übergeben:
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', ...
Für frühere Versionen von Python müssen Sie eine Hilfsfunktion schreiben, um die Argumente explizit zu entpacken. Wenn Sie verwenden möchten with
, müssen Sie auch einen Wrapper schreiben, um sich Pool
in einen Kontextmanager zu verwandeln . (Danke an Myon für diesen Hinweis.)
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 einfacheren Fällen können Sie mit einem festen zweiten Argument auch verwenden partial
, jedoch nur 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. Ein Großteil davon wurde von seiner Antwort inspiriert, die wahrscheinlich stattdessen hätte akzeptiert werden sollen. Aber da dieser oben feststeckt, schien es am besten, ihn für zukünftige Leser zu verbessern.
partial
nochlambda
tun. Ich denke, es hat mit der seltsamen Art und Weise zu tun, wie Funktionen an die Unterprozesse (viapickle
) übergeben werden.