gpt4 book ai didi

python - uWSGI 并优雅地杀死一个多线程 Flask 应用程序

转载 作者:太空狗 更新时间:2023-10-29 21:58:49 28 4
gpt4 key购买 nike

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

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

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

  • uwsgidecoratorspostfork 装饰器,
  • uwsgi 模块有signal_waitsignal_received 函数

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

worker 1 (pid: 20082) 死去的时间太长了...不要怜悯!!!

最佳答案

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

我认为没有简单的方法可以检测应用程序重启,但是 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")

关于python - uWSGI 并优雅地杀死一个多线程 Flask 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14225827/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com