在视图里起一个线程做后台工作,要注意什么?为什么读不到 current_app?线程里出错了谁知道?重启服务时线程里的任务会怎样?这篇用真实的 gunicorn 与 SIGTERM 把每个问题量出来。
current_app.name → RuntimeError: Working outside of application context. db.session.execute → RuntimeError: Working outside of application context.
current_app.name → bg query → 1 has_app_context → True session_id → 4439028624 after_exit → False 线程里的 db.session 与请求线程里的是不是同一个: False (各有各的 session) (传给线程的是真实的 Flask 对象 current_app._get_current_object(),不是代理)
POST /fail → 200 {"ok":true}
响应是 200;异常出现在服务器日志里: True | 日志片段: ['Exception in thread Thread-1 (failing):']daemon 线程:master 在 SIGTERM 后 0.3 秒退出,任务是否做完:False nondaemon 线程:master 在 SIGTERM 后 2.4 秒退出,任务是否做完:True
用 gunicorn gthread worker,SIGTERM 发给 master 进程,--graceful-timeout 设为 10 秒。