python - 将自定义信号处理程序与 gunicorn 结合使用

标签 python flask signals gunicorn

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

最佳答案

您没有解释自定义信号处理程序的含义,但我不确定您是否应该使用 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
...

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

关于python - 将自定义信号处理程序与 gunicorn 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41091482/

相关文章:

python - 在 Python 中计算 Unicode 文本中非间距字符的最快方法

python 2.7 : no module named configparser

matlab - 如何求不均匀波形的包络线

android - 致命信号11

在 c 中捕获 ctrl-c 并继续执行

python - Boto s3 获取元数据

python - Scrapy:如何提取嵌套 div 中的内容(xpath 选择器)?

Python 多行对齐使用格式

database - Flask Migrate 和 PostgreSQL 数据更新

python - 将非线程 SQLAlchemy 代码与 Flask-SQLAlchemy 集成