2009-04-11 9 views
5

Ich Unterklasse der Klasse Process, in einer Klasse, die ich EdgeRenderer aufrufen. Ich möchte multiprocessing.Pool verwenden, außer dass ich anstelle von regulären Prozessen Instanzen meines EdgeRenderer sein möchte. Möglich? Wie?Python Multiprocessing: Pool von benutzerdefinierten Prozessen

+0

Versuchen Sie, Ihren Code zu schreiben, diese Art und Weise Multi-Threading zu verwenden ? –

+0

Mehrfachverarbeitung. –

Antwort

3

Von Jesse Noller:

Es ist derzeit nicht in der API unterstützt, aber wäre nicht schlecht Zusatz. Ich werde schauen sie python2.7 auf das Hinzufügen/2.6.3 3.1 in dieser Woche

2

Ich sehe keinen Haken dafür in der API. Sie können möglicherweise mit der Replikation Ihrer gewünschten Funktionalität durch Verwendung initializer und initargs Argument entkommen. Alternativ können Sie die Funktionalität in das aufrufbare Objekt erstellen, die Sie für die Zuordnung verwenden:

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

Sie können keine Klasse als Argument an 'p.map' übergeben, Sie erhalten einen Pickle-Fehler. Der einzige Weg, den ich gefunden habe, ist eine Art benutzerdefinierte 'pool.map' zu implementieren .... die Prozesse selbst einzurichten und zu füttern. Leider werden mehr Zeilen benötigt. – catwalker333

2

Dies scheint zu funktionieren:

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) 
Verwandte Themen