带额外螺纹的烧瓶和独角兽

时间:2019-08-13 18:24:44

标签: python multithreading flask gunicorn amazon-sagemaker

我正在尝试使用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 -k gevent -b unix:/tmp/gunicorn.sock -w 4 server:app

令人惊讶的是,由于从未执行__main__部分,因此更新线程没有启动。

  

问题如何在带有Gunicorn的Flask应用中使用更新线程(或类似结构)?

1 个答案:

答案 0 :(得分:0)

看起来可以使用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