【问题标题】:Using custom signal handlers with gunicorn使用带有 gunicorn 的自定义信号处理程序
【发布时间】:2016-12-11 21:45:02
【问题描述】:

我有一个带有自定义信号处理程序的 Flask 应用程序,用于在退出前处理清理任务。使用 gunicorn 运行应用程序时,gunicorn 在应用程序完成所有清理任务之前将其杀死。

【问题讨论】:

    标签: python flask signals gunicorn


    【解决方案1】:

    您没有解释自定义信号处理程序的含义,但我不确定您是否应该使用 Flask's signals 来捕获进程级事件,例如关机。相反,您可以使用标准库中的 signal module 来挂钩 SIGTERM 信号,如下所示:

    # app.py - CREATE THIS FILE
    from flask import Flask
    from time import sleep, time
    import signal
    import sys
    
    def create_app():
      signal.signal(signal.SIGTERM, my_teardown_handler)
      app = Flask(__name__)
    
      @app.route('/')
      def home():
        return 'hi'
    
      return app
    
    
    def my_teardown_handler(signal, frame):
      """Sleeps for 3 seconds, then creates/updates a file named app-log.txt with the timestamp."""
      sleep(3)
      with open('app-log.txt', 'w') as f:
        msg = ''.join(['The time is: ', str(time())])
        f.write(msg)
      sys.exit(0)
    
    
    if __name__ == '__main__':
      app = create_app()
      app.run(port=8888)
    
    
    # wsgi.py - CREATE THIS FILE, in same folder as app.py
    import os
    import sys
    from werkzeug.wsgi import DispatcherMiddleware
    from werkzeug.exceptions import NotFound
    
    from app import create_app
    app = DispatcherMiddleware(create_app())
    

    假设您有一个安装了 Flask 和 Gunicorn 的虚拟环境,那么您应该能够使用 Gunicorn 启动应用程序:

    $ gunicorn --bind 127.0.0.1:8888 --log-level debug wsgi:app
    

    接下来,在单独的终端中,您可以将 TERM 信号发送到您的应用,如下所示:

    $ kill -s TERM [PROCESS ID OF GUNICORN PROCESS / $(ps ax | grep gunicorn | head -n 1 | awk '{print $1}')]
    

    为了观察结果,您应该注意到,当您运行 kill 命令时,app-log.txt 文件的内容会在三秒延迟后更新。您甚至可以在此目录中生成第三个终端窗口并运行 watch -n 1 "cat app-log.txt" 以观察此文件实时更新,同时在启动应用程序和发送 TERM 信号之间循环。

    至于将其绑定到生产中,我知道Supervisor has a configuration option 指定stopsignal,如下所示:

    [program:my-app]
    command = /path/to/gunicorn [RUNTIME FLAGS]
    stopsignal = TERM
    ...
    

    但这与确保应用的清理任务完全执行的原始问题不同。

    【讨论】:

    • 我的问题应该更清楚。我正在使用信号模块,但是 gunicorn 在我完成所有清理任务之前关闭了应用程序。
    • 嗯,关于这些清理任务的一些信息怎么样 - 我们应该知道什么?另外,你是如何运行/停止 Gunicorn 的?你试图捕捉哪个信号?
    猜你喜欢
    • 1970-01-01
    • 2017-11-30
    • 1970-01-01
    • 1970-01-01
    • 2022-06-14
    • 1970-01-01
    • 2013-06-19
    • 1970-01-01
    • 2016-04-05
    相关资源
    最近更新 更多