2009-04-11 6 views
5

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

+0

Êtes-vous en train d'écrire votre code pour utiliser multithreading cette façon ? –

+0

Multi-traitement. –

Répondre

3

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

2

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) 
+0

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

2

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) 
Questions connexes