您没有解释自定义信号处理程序的含义,但我不确定您是否应该使用Flask 的信号来捕获进程级事件,例如关闭。相反,您可以使用标准库中的signal模块来挂钩 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())
Run Code Online (Sandbox Code Playgroud)
假设您有一个安装了 Flask 和 Gunicorn 的虚拟环境,那么您应该能够使用 Gunicorn 启动该应用程序:
$ gunicorn --bind 127.0.0.1:8888 --log-level debug wsgi:app
Run Code Online (Sandbox Code Playgroud)
接下来,在单独的终端中,您可以将 TERM 信号发送到您的应用程序,如下所示:
$ kill -s TERM [PROCESS ID OF GUNICORN PROCESS / $(ps ax | grep gunicorn | head -n 1 | awk '{print $1}')]
Run Code Online (Sandbox Code Playgroud)
要观察结果,您应该注意到,在三秒延迟后app-log.txt运行该命令时,文件的内容会更新。kill您甚至可以在此目录中生成第三个终端窗口,并运行watch -n 1 "cat app-log.txt"以观察该文件的实时更新,同时在启动应用程序和发送 TERM 信号之间循环。
至于将其绑定到生产中,我知道Supervisor 有一个配置选项来指定stopsignal,如下所示:
[program:my-app]
command = /path/to/gunicorn [RUNTIME FLAGS]
stopsignal = TERM
...
Run Code Online (Sandbox Code Playgroud)
但这是与确保应用程序的清理任务完全执行的原始问题不同的主题。
| 归档时间: |
|
| 查看次数: |
3177 次 |
| 最近记录: |