7

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

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

有没有人尝试过其中之一?如果是这样,检测应用重启事件的正确方法是什么?

  • uwsgidecoratorspostfork装饰师,
  • uwsgi模块有signal_waitsignal_received功能

signal_wait功能块,所以我的线程运行但 uWSGI 不服务请求。我也尝试过设置scheduler.daemonic为 False 和 True - 这两种方式都无济于事。uWSGI 进程仍然会记录如下内容:

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

4

1 回答 1

1

我正在尝试找出一种检测“应用程序重启”的方法,以便能够关闭 APScheduler 线程池。

我认为没有简单的方法可以肯定地检测应用程序重启,但是 uwsgi 可以在重新加载或关闭后执行代码,方式如下:

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

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

2) 将在其中一名工作人员中调用:

import uwsgi

def will_invoked_after_reload_or_shutdown():
    print("I was invoked")

uwsgi.atexit = will_invoked_after_reload_or_shutdown

3)在这种情况下,您应该重新加载 thru 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")
于 2017-03-08T18:33:12.120 回答