Единственный известный мне способ (из поиска и проверки источника gevent) изящно отключить сервер на основе gevent WSGI:
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()
Теперь под изящным я подразумеваю ожидание, пока все гринлеты завершат работу сами по себе. Так, например, если они все еще обслуживают запросы, они могут завершить их должным образом.
Проблема в том, что с приведенным выше казалось бы кодом сервер действительно ожидает макс. 60 секунд, но все TCP-соединения разрываются сразу после получения SIGTERM
. Однако гринлеты продолжают делать то, что они делали (например, спят), пока не закончат или не истечет тайм-аут.
Любые идеи?