【问题标题】:Flask and Gunicorn with Additional Threads带有附加线程的 Flask 和 Gunicorn
【发布时间】:2019-08-13 18:24:44
【问题描述】:

我正在尝试使用 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__ 部分从未执行过。

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

【问题讨论】:

    标签: python multithreading flask gunicorn amazon-sagemaker


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2016-11-20
      • 2019-10-03
      • 2020-03-12
      • 2018-07-08
      • 1970-01-01
      • 1970-01-01
      • 2016-07-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多