私は、ボトル フレームワークを介して Web ページによって制御される小さな python アプリに取り組んでいます。問題は、バックグラウンドでスレッドを実行していることがありますが、たとえば Ctrl+C を使用して Bottle インスタンスをシャットダウンすると、これらのスレッドが終了するように指示されないため、ハングするだけです。ボトル サーバーのシャットダウンをキャッチし、メソッドを呼び出してクリーンアップを行う方法はありますか?
質問する
2080 次
4 に答える
2
try
/ finally
:
# start threads here
try:
bottle.run(...) # or app.run(...)
finally:
# clean up (join) threads here
編集: try ブロックさえ必要ないことを正しく指摘してくれた @linusg に感謝します。単に使用する方が良い:
# start threads here
bottle.run(...) # or app.run(...)
# if we reach here, run has exited (Ctrl-C)
# clean up (join) threads here
于 2013-10-15T15:38:41.633 に答える
0
スレッドを正常にシャットダウンする必要がない場合は、それらをデーモンスレッドにするだけで、プロセスはそれ以上変更せずに正常に終了します。
スレッドは「デーモンスレッド」としてフラグを立てることができます。このフラグの意味は、デーモン スレッドだけが残ったときに Python プログラム全体が終了することです。初期値は作成スレッドから継承されます。フラグはデーモン プロパティを介して設定できます。
t = threading.Thread(target=myfunc)
t.daemon = True
t.start()
# because t is a daemon thread, no need to join it at process exit.
NB、あなたの質問の言い回しは、あなたの本当の問題は、リソースを解放する必要があるのではなく、プロセスが終了時にハングすることであることを意味しますが、これを指摘する価値があります:
注: デーモン スレッドは、シャットダウン時に突然停止します。それらのリソース (開いているファイル、データベース トランザクションなど) が適切に解放されない可能性があります。
于 2013-10-15T15:44:32.577 に答える
0
__del__
.
何かのようなもの:
class MyApp(bottle.Bottle):
def __del__(self):
# clean up threads here
# from here it's just business as usual
app = MyApp()
@app.route('/')
def home()
return 'hello, world.\n'
app.run('127.0.0.1', 8080)
于 2013-10-15T13:28:21.420 に答える