uWSGI和优雅地杀死了一个多线程Flask应用程序

2024-06-26 13:57:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在实现一个使用APScheduler(它使用线程池)来获取一些资源的系统。在

我正在尝试找出一种检测“应用程序重启”的方法,以便能够关闭APScheduler线程池。我正在重新启动发送SIGHUP到uWSGI主进程。在

以前有人试过这个吗?如果是,那么什么是检测应用程序重新启动事件的正确方法?在

  • uwsgidecoratorspostfork修饰符
  • uwsgi模块具有signal_wait和{}功能

signal_wait函数块使我的线程运行,但uWSGI不提供请求。我也尝试过将scheduler.daemonic设置为False和True,但这两种方法都没有帮助。uWSGI进程仍然记录如下:

worker 1 (pid: 20082) is taking too much time to die...NO MERCY !!!


Tags: 方法应用程序signal进程系统事件资源修饰符
1条回答
网友
1楼 · 发布于 2024-06-26 13:57:29

I am trying to figure out a way to detect "app restart" so that I will be able to shut down APScheduler thread pool.

我认为没有简单的方法可以确定地检测app restart,但是uwsgi可以在重新加载或关闭后执行代码,方法如下:

1)代码将在单独的进程中执行:将hook as user atexit添加到您的uwsgi配置中:

[uwsgi]
 ...
 hook-as-user-atexit = exec:python finalization.py

2)将在其中一个worker中调用:

^{pr2}$

3)在这种情况下,您应该通过touch uwsgi.pid重新加载。将仅在重新加载后在其中一个工作线程中调用:

[uwsgi]
 ...
 pidfile = ./uwsgi.pid
 touch-reload = ./uwsgi.pid

Python代码:

import uwsgi

def will_executed_after_reload(*args):
    print("I was invoked")

uwsgi.register_signal(17, "worker", will_executed_after_reload)
uwsgi.add_file_monitor(17, "./uwsgi.pid")

相关问题 更多 >