Flask 和带有附加线程的 Gunicorn

Flask and Gunicorn with Additional Threads

我正在尝试使用 Gunicorn 构建 Flask 应用程序来处理并发请求。对于它的价值,上下文是一个自带容器的 Sagemaker 应用程序。

问题是我需要应用程序定期检查更新。所以我想为此实现一个线程。这是一些带有更新线程的 Flask 代码的最小示例。

server.py

from flask import Flask
import time, threading

app = Flask(__name__)

message = True

def update():
  while True:
    message = not message
    time.sleep(10)

@app.route("/")
def hello():
  global message
  return message

update_thread = threading.Thread(target=update)

if __name__ == "__main__":
  update_thread.start()
  app.run()
  update_thread.join()

然后我用 gunicorn 启动:

gunicorn -k gevent -b unix:/tmp/gunicorn.sock -w 4 server:app

也许不足为奇的是,更新线程不会启动,因为 __main__ 部分从未执行过。

Question: How can one use an update thread (or similar construct) in a Flask app with Gunicorn?

看起来这可以使用 Flask-APScheduler 完成,如下所示:

pip install flask_apscheduler

server.py

from flask import Flask
from apscheduler.schedulers.background import BackgroundScheduler
import atexit

app = Flask(__name__)

message = True

def update():
  global message
  message = not message

scheduler = BackgroundScheduler()
scheduler.add_job(func=update,trigger="interval",seconds=10)
scheduler.start()
# shut down the scheduler when exiting the app
atexit.register(scheduler.shutdown)

@app.route("/")
def hello():
  global message
  return message

if __name__ == "__main__":
  app.run()

然后照常启动 gunicorn -k gevent -b unix:/tmp/gunicorn.sock -w 4 server:app