我正在实现一个使用APScheduler(使用线程池)的系统,以便获取一些资源。
我试图找出一种方法来检测“app restart”,以便我可以关闭APScheduler线程池。我正在重新启动,将SIGHUP发送到uWSGI主进程。
有没有人尝过其中之一?如果是这样,检测应用程序重启事件的正确方法是什么?
uwsgidecorators
有postfork
装饰者,uwsgi
模块包含signal_wait
和signal_received
个功能 signal_wait
功能块,所以我的线程运行,但uWSGI不提供请求。我也尝试将scheduler.daemonic
设置为False和True - 它无论如何都没有帮助。 uWSGI进程仍然记录如下:
worker 1 (pid: 20082) is taking too much time to die...NO MERCY !!!
答案 0 :(得分:1)
我试图找出一种检测“app restart”的方法,以便我能够关闭APScheduler线程池。
我认为没有简单的方法可以确定地检测 app restart ,但是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)在这种情况下,您应该通过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")