uWSGI信号从Master传播到Worker

时间:2020-09-14 09:51:09

标签: python signals wsgi

在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()

1 个答案:

答案 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}})