2

私は、ボトル フレームワークを介して Web ページによって制御される小さな python アプリに取り組んでいます。問題は、バックグラウンドでスレッドを実行していることがありますが、たとえば Ctrl+C を使用して Bottle インスタンスをシャットダウンすると、これらのスレッドが終了するように指示されないため、ハングするだけです。ボトル サーバーのシャットダウンをキャッチし、メソッドを呼び出してクリーンアップを行う方法はありますか?

4

4 に答える 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 に答える