在uWSGI停止/重新启动时,我希望所有工作人员都进行清理。
我用
lazy-apps = False
,因为相反,我在工作线程中没有正确设置数据库连接(我没有使用SQLAlchemy)。
主进程正在正确接收POSIX信号,尽管我无法拦截它们以随后将某些信号转发给工作人员,从而迫使他们执行清理。我能够在工人方面注册信号并以编程方式使用它们。
def myTrmHandler(signum):
print("Catched SIGNAL %s" % (signum))
backend.close()
@uwsgidecorators.postfork
def preload():
'''
preload code working OK in the workers in non-lazy mode
it launches some background threads that are enabled in uwsgi configuration
'''
def main():
uwsgi.register_signal(2, "workers", myTrmHandler)
uwsgi.register_signal(3, "workers", myTrmHandler)
uwsgi.register_signal(15, "workers", myTrmHandler)
app.run()
if __name__ == '__main__':
main()
答案 0 :(得分:0)
register_signal 函数是 uwsgi 自己的信号 API 的一部分,它与 uwsgi docs: 中所述的 POSIX 信号无关
<块引用>uWSGI 信号与 UNIX/Posix 信号没有共同点(如果您正在寻找这些信号,管理 uWSGI 服务器就是您的页面)。
This page 介绍了 uwsgi 进程对 POSIX 信号的利用,尽管它没有过多介绍如何覆盖来自您的应用的信号。
使用 python 应用程序,您可以使用 stdlib 的 signal.signal(...)
来注册您的信号处理程序,但您还需要添加 py-call-osafterfork
命令行/配置选项以使其工作({{ 3}})