2015-09-21 6 views
7

Pythonで子プロセスを入れようとしたときにこの現象が見られました。ここで親プログラムparent_process.py次のとおりです。子プロセス内に子プロセスを作成し、Python多重処理が失敗した場合

import multiprocessing 
import child_process 

pool = multiprocessing.Pool(processes=4) 
for i in range(4): 
     pool.apply_async(child_process.run,()) 
pool.close() 
pool.join() 

親プログラムは、次の子プログラムchild_process.pyで「実行」関数を呼び出します。私は親プログラムを実行すると

import multiprocessing 

def run(): 
     pool = multiprocessing.Pool(processes=4) 
     print 'TEST!' 
     pool.close() 
     pool.join() 

、何もプリントアウトされませんでしたプログラムはすぐに終了しました。ただし、print 'TEST!'を1行上に移動すると(ネストされた子プロセスが作成される前に)、'TEST!'が4回印刷されます。

子プロセスのエラーが画面に表示されないため、子プロセスが独自のネストされた子プロセスを作成すると、プログラムがクラッシュすることがわかります。

シーンの後ろで何が起こるか説明できますか?ありがとう!

+0

ネスティングには制限があり、Exceptイオンですが、この場合は遠く離れています。私は他のどこかの問題を、おそらく 'プール'メカニズムだと思う... – CoMartel

+0

これで改善しようとしているのは何ですか?より大きい 'Pool'を起動するよりも' Pool'のプールを起動する方が速くはありません – CoMartel

+0

@HarryPotfleur各子プロセスが独自のプロセスを管理できるようにするため、プログラムは論理的に見た目が綺麗に見えます。 16個のコアがあるとしたら、4x4ネストされたプロセスを同時に実行できます。私は以下の回避策を提供します。 –

答えて

4

multiprocessingドキュメントによれば、デーモンプロセスは子プロセスを起動できません。

multiprocessing.Poolは、デーモンプロセスを使用して、プログラムが終了したときに漏れないようにします。

1

noxdafoxが述べたように、multiprocessing.Poolはデーモンプロセスを使用しています。私の代わりにmultiprocess.Processを使用する単純な回避策を見つけた:

親プログラム(名前child_process.py有する)

import multiprocessing 
import child_process 

processes = [None] * 4 
for i in range(4): 
    processes[i] = multiprocessing.Process(target=child_process.run, args=(i,)) 
    processes[i].start() 
for i in range(4): 
    processes[i].join() 

子プログラム:

import multiprocessing 

def test(info): 
    print 'TEST', info[0], info[1] 

def run(proc_id): 
    pool = multiprocessing.Pool(processes=4) 
    pool.map(test, [(proc_id, i) for i in range(4)]) 
    pool.close() 
    pool.join() 

出力されるTESTの16行:

TEST 0 0 
TEST 0 1 
TEST 0 3 
TEST 0 2 
TEST 2 0 
TEST 2 1 
TEST 2 2 
TEST 2 3 
TEST 3 0 
TEST 3 1 
TEST 3 3 
TEST 3 2 
TEST 1 0 
TEST 1 1 
TEST 1 2 
TEST 1 3 
関連する問題