2009-04-11 18 views
5

Sto sottoclassi la classe Process in una classe che chiamo EdgeRenderer. Voglio usare multiprocessing.Pool, ad eccezione di processi normali, voglio che siano istanze del mio EdgeRenderer. Possibile? Come?Multiprocessing di Python: Pool di processi personalizzati

+0

Si sta tentando di scrivere il codice per utilizzare più threading in questo modo ? –

+0

Elaborazione multipla. –

risposta

3

Da Jesse Noller:

Non è attualmente supportato nel API, ma non sarebbe una cattiva Inoltre. Guarderò aggiungendolo al python2.7/2.6.3 3.1 questa settimana

2

Non vedo alcun hook per esso nell'API. Potresti riuscire a farla franca replicando la funzionalità desiderata utilizzando l'argomento initializer e initargs. In alternativa, si può costruire la funzionalità in oggetto chiamabile che si utilizza per la mappatura:

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

Non è possibile passare una classe come argomento a 'p.map', si otterrà l'errore pickle. L'unico modo che ho trovato intorno a questo è quello di implementare una sorta di 'pool.map' personalizzata ... .... impostando e alimentando i processi da solo. Sfortunatamente prenderà più linee. – catwalker333

2

Questo sembra funzionare:

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) 
Problemi correlati