2016-04-01 19 views
0

python 2.7マルチプロセッシング。別のpool.apply_asyncpython 2.7マルチプロセッシングpool.apply_async他のpool.apply_asyncの中

内部pool.apply_async Iは2つのモジュールAを有し、B. モジュール 'A' は、サイズ100のプールを宣言しpool.apply_async,モジュール 'B' から関数 'BX' と呼ばれます。 モジュール 'B'の関数 'BX'は、サイズnの別のプールを作成し、そのpool.apply_asyncを使用して別の関数が呼び出されます。

この問題は、モジュール 'B'のプールを宣言した時点で実行プロセスが停止/終了していることに直面しています。モジュール 'A'の1番目のプールの内側にあるモジュール 'B'の2番目のプールを宣言しています。

pool.apply_async内でpool.apply_asyncを実行している場合の解決策はありますか?

+0

何スレッド内のスレッドのポイントだ、とあなたが言うように、マルチプロセッシング、スレッドで作業していない、プロセスで作業中です:) –

答えて

0

あなたは私が下に示しているような何かをしなければなりません。 multiprocessingという自分のフォーク(pathos)を使用していることに注意してください。なぜなら、シリアル化機能が向上し、インタープリタから実行できるようになり、プールの作成と保守がより効率的になるからです。ここに示されているようしかし、ワークフローは、ほぼ同じであるべきである:pathosamapmultiprocessingmap_asyncあること

>>> import pathos as p 
>>> tp1 = p.pools.ThreadPool(100) 
>>> tp2 = p.pools.ThreadPool(50) 
>>> import itertools as it 
>>> 
>>> res = tp1.amap(tp2.amap, it.repeat(lambda x:x**2), [range(10)]*5) 
>>> ans = res.get() 
>>> [v.get() for v in ans] 
[[0, 1, 4, 9, 16, 25, 36, 49, 64, 81], [0, 1, 4, 9, 16, 25, 36, 49, 64, 81], [0, 1, 4, 9, 16, 25, 36, 49, 64, 81], [0, 1, 4, 9, 16, 25, 36, 49, 64, 81], [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]] 

注意。 apply_asyncがほしいのであれば、apipepathosになります。そして、物事をシャットダウンする:

だから、
>>> tp1.close() 
>>> tp2.close() 
>>> tp1.join() 
>>> tp2.join() 
>>> # pathos has an additional shutdown step to clear the pool cache 
>>> tp1.clear() 
>>> tp2.clear() 

を、apply_asyncに相当し、それは次のようになりたい:

>>> tp1 = p.pools.ThreadPool(100) 
>>> tp2 = p.pools.ThreadPool(50) 
>>> tp1.apipe(tp2.apipe, lambda x:x**2, 10).get().get() 
100 
>>> tp1.close() 
>>> tp2.close() 
>>> tp1.join() 
>>> tp2.join() 
>>> tp1.clear() 
>>> tp2.clear() 
関連する問題