Kubernetesで実行しているとき、特にgraceful shutdownのときに正しく動作するFlaskアプリを書き込もうとしています。Flaskでバックグラウンドタイマーを実行するには
そのように、私は、コードを持っている必要があります:
- は、シャットダウン信号 を受け取る時間が 「UP」になるまで、「シャットダウンタイマー」
- を開始
- ノーマルとしての要求を続けます
- その後
を自分自身をシャットダウンこれまでのところ、私が持っていることはこれです:
from flask import Flask, abort
import signal
import time
app = Flask(__name__)
shuttingDown = False
def exit_gracefully(self, signum):
app.logger.error('Received shutdown signal. Exiting gracefully')
global shuttingDown
shuttingDown = True
# TODO: wait for some time here to ensure we are not receiving any more
# traffic
time.sleep(20)
exit(0)
signal.signal(signal.SIGTERM, exit_gracefully)
@app.route("/")
def hello():
return "Hello World!"
@app.route("/_status/liveness")
def liveness():
return "I am alive"
@app.route("/_status/readiness")
def readiness():
if not shuttingDown:
return "I am ready"
else:
abort(500, 'not ready anymore')
"シャットダウン"信号を送信した後を除いて上記の "動作"は、シャットダウン時の "猶予期間"内にあっても "/"への通常のリクエストは応答されません)。
"time.sleep()"の呼び出しは同期しているようです。
これを「非同期」にする方法を知っている人はいますか?時間が "アップ"になるまでアプリがリクエストを処理し続けるようにするには?
ウェブサーバーとしては何を使用しますか?私はKubernetesに慣れていないので、これは愚かな疑問かもしれません。あなたのHTTPサーバーを提供しているのですか、またはFlaskの内部サーバー、WSGIなどを使用していますか? – Hannu
上記の組み込みFlask開発サーバーを使用しています。 – srkiNZ84
下記の私の修正された回答を参照してください。それはそれを行うべきであり、代替手段も提供する。 – Hannu