2012-04-06 14 views
0

私はPythonマルチプロセッシングを使用したプログラムを持っています。私は、メインプログラムで作成されたすべてのプロセスを終了することができますが、メインプログラムは常に戻り値を待っているので停止できません。誰も私にこの問題を解決する方法のいくつかの提案を与えることができますか?次のように プロセスはPythonマルチプロセスプールで停止できません

コードスニペット

は:

メインプログラム:私はすべてのために、 "サブ機能を行う" 出力を見ることができる

# doing some other jobs 
result = {.....} # a large dictionary 
print 'done with sub functions' 
return result # if I change it to "return 1", it can finish successfully 

workers = multiprocessing.Pool(4) 
args = [arg1, arg2, arg3, arg4] 
results = workers.map(subfunc, args) 
print "we are in main functions " 

subfunc(*引数) mainで作成されたプロセスは出力されず、 "main関数にあります"。誰も私が問題を理解するのを助けることができますか?

+2

結果の長さに合わせてテストすることはできますか? Mayhapこの動作は、ループを実行しないためです。 – mklauber

+0

結果ディクショナリに再帰参照があり、ピクルにすることができないことがあります。 pickleまたはjsonとしてstdoutに書き出してみてください。 – j13r

+0

これは私が今やったことです、それは動作します。 – hanqiang

答えて

2

subfuncの結果が返された後も、子プロセスは結果をピックアップしてプロセス間通信を通じてマスタープロセスに送信する必要があります。したがって、サブプロセスが実際に終了する準備が整う前に、「完了」を印刷しています。

"fake"を返すだけで、それが問題であることを確認してから、プロセス間で結果をより迅速に伝達する方法について考えることができます。たとえば、リストの内容によっては、内容を厳密な形式でパッケージ化することも、共有メモリが実行可能なオプションである可能性もあります。

+0

サブフックで "1"を返すと、メインプログラムは正常終了できます。ですから、私はこの問題が返された値の大きさによって引き起こされると考えています。私のプログラムでは、返されたsubfuncの値は1 GBにもなります。あなたはどう思いますか? – hanqiang

+0

@hanqiangええ、それはおそらくそれです。どのようなデータですか?共有メモリ、[メモリマップされたファイル](http://docs.python.org/library/mmap.html)、データベース、または他の方法で、ワーカーからマスターに通信したいと思うかもしれません。普通の古いファイルI/O、何か。 – Dougal

+0

うわー...なぜ私の子プロセスが完了したと言われているのか理解しようと時間を費やしましたが、状況はちょうど凍っていました。それが起こっていることが判明し、私は単に待つ必要があった。 – CodeGuyRoss

関連する問題