私はレンダリングを行っています。クライアントが新しいコマンドを受け取れるように、レンダリングの複数のインスタンスをブロックすることなくクライアントを起動する必要があります。私は正しく動作しているが、私は作成されたプロセスを終了するのに問題があります。グローバルレベルでPythonマルチプロセッシングプールが終了する
(私は任意の関数からアクセスできるように)、私は私のプールを定義します。
p = Pool(2)
私はその後、apply_asyncと私のレンダラを呼び出します。仕上げに機能
for i in range(totalInstances):
p.apply_async(render, (allRenderArgs[i],args[2]), callback=renderFinished)
p.close()
バックグラウンドでプロセスを起動し、新しいコマンドを待ちます。 (それがエラーを印刷し)、Pythonの終了が、バックグラウンド・プロセスが残っている
def close():
'close this client instance'
tn.write ("say "+USER+" is leaving the farm\r\n")
try:
p.terminate()
except Exception,e:
print str(e)
sys.exit()
sys.exit()
エラーを与えていないようです:私はクライアントを殺し、レンダリングを停止します簡単なコマンドを作りましたランニング。誰もがこれらの起動プログラムを制御する良い方法をお勧めしますか?
'from multiprocessing import util;でデバッグログを有効にしてください。 util.get_logger()。setLevel(util.DEBUG) 'を実行し、出力を貼り付けます。 – schlamar
これまでのような振る舞いを見たことがありますが、今は再現できません... p.join()を呼び出すとp.terminate()を呼び出した後に役立つのだろうか?また、終了を呼び出す必要がある場合でも、sys.exit()を実行するだけでプールとそのプロセスすべてが適切にガベージコレクトされるかどうかは疑問です。 – mdscruggs
ロギングを有効にしようとすると、コンソールでこれが表示されます:「ロガーのマルチプロセッシングでハンドラが見つかりませんでした」残念ながら、p.terminate()の後にp.join() .exit()はPythonを閉じますが、プロセスをバックグラウンドで実行します。 – tk421storm