gevent WSGI ベースのサーバーを正常にシャットダウンする唯一の方法 (gevent のソースの検索と検査から) は次のとおりです。
server = gevent.wsgi.WSGIServer(('', 80), someWSGIApp)
def shutdown():
print('Shutting down ...')
server.stop(timeout=60)
exit(signal.SIGTERM)
gevent.signal(signal.SIGTERM, shutdown)
server.serve_forever()
ここで、優雅にというのは、すべての greenlet が自然に終了するのを待つことです。たとえば、まだリクエストを処理している場合、適切に完了することができます。
問題は、上記の一見正しいコードでは、サーバーが実際に max を待機することです。60 秒以内ですが、すべての TCP 接続は を受信するとすぐに終了しますSIGTERM
。ただし、Greenlet は終了するかタイムアウトが発生するまで、以前と同じこと (たとえば、スリープ状態) を続けます。
何か案は?