[英]How to handle graceful shutdown in Python uwsgi application
我有一个简单的 Python uwsgi 应用程序,它遵循基本模式:
def application(env, start_response):
... do something ...
... create some threads ...
... handover the work to the threads ...
start_response('200 OK', [('Content-Type','text/html')])
return result
我的系统管理员抱怨我的应用程序没有处理关闭,每次他想重新启动 uwsgi 服务时,他都必须等待 uwsgi 超时才能终止应用程序进程。 显然,这最多可能需要 30 秒,即服务不可用的时间。
是否有特定的信号或调用 uwsgi 在要关闭应用程序时发送该应用程序? 我该如何处理?
def goodbye():
print "Goodbye from worker %d" % uwsgi.worker_id()
uwsgi.atexit = goodbye
只需使用 python 的atexit
模块进行整理:
import atexit
atexit.register(uwsgi_tidy_up)
如果您的整理只在 uwsgi 下有意义,请先检查一下:
try:
import uwsgi
atexit.register(uwsgi_tidy_up)
except ImportError:
pass
但是,您应该知道atexit
处理程序在所有非守护线程完成之前不会被调用。 这意味着如果你想使用这个方法来停止你的线程并加入它们,你需要让它们daemon=True
。
据我了解,这样做的原因是当 uwsgi 被告知重新加载它时,它会向“皇帝”工人(它是所有工人的父级)发出信号来这样做。 然而,皇帝并没有直接向工人发出信号(在kill -SIGNAL
的意义上),而是使用内部机制告诉他们优雅地完成。 这就是atexit
处理程序有机会运行的原因,因为工作人员会根据“皇帝”的要求正常终止。 这就是为什么从工作线程创建的任何线程都是daemon=True
,以免阻塞正常的终止过程(这可能是终止超时的部分原因)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.