multiprocesamiento Python: piscina de procesos personalizados
-
09-09-2019 - |
Pregunta
Estoy de subclases de la clase Process, en una clase que llamo EdgeRenderer. Quiero usar multiprocessing.Pool
, excepto que en lugar de los procesos regulares, yo quiero que sean las instancias de mi EdgeRenderer. ¿Posible? ¿Cómo?
Solución
A partir de Jesse Noller:
No se admite actualmente en el API, pero no sería una mala adición. Voy a mirar a añadirla a python2.7 / 2.6.3 3.1 esta semana
Otros consejos
No veo ningún gancho para que en el API. Usted puede ser capaz de salirse con la replicación de su funcionalidad deseada mediante el uso de initializer
y el argumento initargs
. Alternativamente, se puede construir la funcionalidad en el objeto invocable que se utiliza para el mapeo:
class EdgeRenderTask(object):
def op1(self,*args):
...
def op2(self,*args):
...
p = Pool(processes = 10)
e = EdgeRenderTask()
p.apply_async(e.op1,arg_list)
p.map(e.op2,arg_list)
Esto parece funcionar:
import multiprocessing as mp
ctx = mp.get_context() # get the default context
class MyProcess(ctx.Process):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
print("Hi, I'm custom a process")
ctx.Process = MyProcess # override the context's Process
def worker(x):
print(x**2)
p = ctx.Pool(4)
nums = range(10)
p.map(worker, nums)