La respuesta a esto depende de la versión y la situación. La respuesta más general para las versiones recientes de Python (desde 3.3) fue descrita por primera vez a continuación por JF Sebastian . 1 Utiliza el Pool.starmap
método, que acepta una secuencia de tuplas de argumentos. Luego, desempaqueta automáticamente los argumentos de cada tupla y los pasa a la función dada:
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', ...
Para versiones anteriores de Python, necesitará escribir una función auxiliar para desempaquetar los argumentos explícitamente. Si desea usar with
, también necesitará escribir un contenedor para convertirse Pool
en un administrador de contexto. (Gracias a muon por señalar esto).
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', ...
En casos más simples, con un segundo argumento fijo, también puede usar partial
, pero solo en 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 de esto fue inspirado por su respuesta, que probablemente debería haber sido aceptada en su lugar. Pero dado que este está atascado en la parte superior, parecía mejor mejorarlo para futuros lectores.
partial
nilambda
hacer esto. Creo que tiene que ver con la extraña forma en que las funciones se pasan a los subprocesos (víapickle
).