2009-04-11 22 views
5

Processクラスを、私がEdgeRendererと呼ぶクラスにサブクラス化しています。私はmultiprocessing.Poolを使用したいが、通常のプロセスの代わりに、それらを私のEdgeRendererのインスタンスにしたい。可能?どうやって?Pythonマルチプロセッシング:カスタムプロセスのプール

+0

は、あなたがこの方法マルチスレッドを使用するようにコードを記述しようとしています? –

+0

マルチ処理。 –

答えて

3

:別の方法として、あなたがマッピングに使用呼び出し可能オブジェクトに機能を構築することができますこれは、現在 APIでサポートされていませんが、悪いではないでしょう

添加。 私は/ 2.6.3 3.1今週 python2.7に追加することを見てみましょう

これが動作しているようです
2

私はAPIのためのフックが表示されません。 initializerinitargs引数を使用して、目的の機能を複製することができます。ジェシーNollerから

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

'p.map'の引数としてクラスを渡すことはできません。あなたはpickleエラーを受け取ります。私がこれを見つけた唯一の方法は、一種のカスタム 'pool.map'を実装することです。残念ながら、それはもっと多くの行を取るでしょう。 – catwalker333

2

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) 
関連する問題