2011-08-02 1 views
2

多くのPythonユーザーとは逆の問題があります。 I already got helpをマルチプロセッシングに切り替えて私の仕事用コンピュータのコアを4つすべて利用しています。その結果、実際のパフォーマンスの向上が見られました。しかし、その改善はやや信頼性がありません。私のプログラムのCPU使用率は、たとえ6つのプロセスが稼動していても、稼働し続けると悪化するようです。いくつかのデバッグメッセージを追加した後、これは私が生成していたプロセスのいくつか(完了まで実行されるはずです)が時期尚早に死んでいたことが原因であることがわかりました。プロセスの実行方法の本体は、whileループ真で、かつ唯一の方法はアウト、このブロックである:Python - 非空のマルチプロセッシングからQueue.Empty例外を取得します.Queue

try: 
    f = filequeue.get(False) 
except Empty: 
    print "Done" 
    return 

filequeueがサブプロセスの作成前に移入され、それは間違いなく、実際に空ではありません。すべてのプロセスは、実際に空になったらほぼ同時に終了する必要があります。 Queue.get呼び出しに0以外のタイムアウト(0.05)パラメータを追加しようとしましたが、これで問題は解決されませんでした。空でないキューからQueue.empty例外が発生するのはなぜですか?

+0

これは 'multiprocessing.Queue'か' Queue.Queue'ですか? – NPE

+0

'filequeue.get(False)'の代わりに 'filequeue.get(True)'を実行するとどうなりますか? – NPE

+0

マルチプロセッシングを使用しているので、それはマルチプロセッシングです。私がfilequeue.get(True)を実行した場合、もちろんQueue.Empty例外は発生しませんが、一度ファイルキューが空になるとすべてのprocessessは永遠にブロックされるため、メインプロセスが生成されたプロセスに参加しようとするとすべてが停止します。 – dpitch40

答えて

3

filequeue.get(False)の代わりにfilequeue.get(True)を使用することをおすすめします。これにより、要素が増えるまでキューがブロックされます。

しかし、最終要素が処理された後は永遠にブロックされます。

この問題を回避するには、メインプロセスでは、各キューの末尾に特殊な "センチネル"オブジェクトを追加することができます。ワーカーはキューの空に頼るのではなく、この特殊オブジェクトを見て終了します。

+1

まさに私がやったこと。例外については驚くほど不思議です... – dpitch40

1

私は同様の問題を抱えていて、実験では、キューが空でない場合でもget(False)が疑似的にEmptyをスローすることができないことを確認しました。私の使用例では、作業者はQueueで作業がなくなったときに終了する必要があるため、get(True)はオプションではありません。

私は、 "except Empty:"ブロックで、Queueが実際に空であることを確認した場合、それが動作することを確認しました。 - 空が本当に空でなければempty()はTrueを返しません。

私はPython 2.7を使用していました。

関連する問題