Je sous-classe la classe Process dans une classe que j'appelle EdgeRenderer. Je veux utiliser multiprocessing.Pool
, excepté au lieu des processus réguliers, je veux qu'ils soient des instances de mon EdgeRenderer. Possible? Comment?Multiprocessing Python: Pool de processus personnalisés
Répondre
De Jesse Noller:
Il est pas pris en charge dans l'API , mais ne serait pas une mauvaise une addition. Je vais regarder l'ajouter à python2.7/2.6.3 3.1 cette semaine
Je ne vois aucun crochet pour cela dans l'API. Vous pourriez être en mesure de sortir avec la réplication de votre fonctionnalité souhaitée en utilisant initializer
et initargs
argument. Alternativement, vous pouvez construire la fonctionnalité dans l'objet appelable que vous utilisez pour la cartographie:
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)
Vous ne pouvez pas passer une classe en argument à 'p.map', vous obtiendrez une erreur de pickle. Le seul moyen que j'ai trouvé autour de ceci est de mettre en place une sorte de 'pool.map' personnalisé ... en mettant en place et en alimentant moi-même les processus. Malheureusement, ça va prendre plus de lignes. – catwalker333
Cela semble fonctionner:
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)
Êtes-vous en train d'écrire votre code pour utiliser multithreading cette façon ? –
Multi-traitement. –