我有一个简单的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模块
只需使用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
很重要,这样就不会阻止正常的终止过程(这可能是终止超时的部分原因)。