当uwsgi重新启动时,我如何及时整理旧Python工作人员中的资源,而不延迟重新启动



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

最新更新