繁体   English   中英

如何在 Python uwsgi 应用程序中处理正常关机

[英]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模块

只需使用 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM