【问题标题】:How can I start an asynchronous function in Flask / gunicorn / gevent?如何在 Flask/gunicorn/gevent 中启动异步函数?
【发布时间】:2019-10-09 17:05:55
【问题描述】:

我目前有一个 Flask 应用程序

from flask import Flask
import time

app = Flask(__name__)


@app.route('/')
def foobar_view():
    long_running()  # TODO: Just trigger this; don't wait for completion
    return 'Done!'


def long_running():
    print('long_running:start')
    time.sleep(100)
    print('long_running:end')


app.run(host='localhost', port=5000)

开始于

gunicorn --worker-class=gevent \
         --worker-connections=1000 \
         --bind 0.0.0.0:5000 my_app.app:app \
         --workers=4 \
         --timeout 120 \
         --keep-alive 120

应用不会有很重的负载,这个long_running函数只会很少被触发。我正在寻找一种简单的方法来运行它,并且我愿意接受有关 gunicorn / gevent 的更改。我正在使用 Python 3.7。

如何让long_running 异步执行?

【问题讨论】:

    标签: asynchronous flask gunicorn python-3.7 gevent


    【解决方案1】:

    解决方案可能是在线程中运行 int:

    from flask import Flask
    import time
    from threading import Thread
    
    app = Flask(__name__)
    
    
    @app.route('/')
    def foobar_view():
        Thread(target=async_long_running, args=(app, 'works')).start()
        return 'Done!'
    
    
    def async_long_running(app, msg):
        with app.app_context():
            long_running(msg)
    
    def long_running(foo):
        print('long_running:start:{}'.format(foo))
        time.sleep(100)
        print('long_running:end')
    
    
    app.run(host='localhost', port=5000)
    

    【讨论】:

    • 我也没有。我通常更喜欢像芹菜这样的工作跑步者,但在这种情况下我需要一些轻量级的东西,IIRC
    猜你喜欢
    • 2012-11-13
    • 1970-01-01
    • 2017-12-20
    • 1970-01-01
    • 2022-12-25
    • 2019-05-01
    • 2017-01-30
    • 2020-07-23
    • 1970-01-01
    相关资源
    最近更新 更多