Как я могу запустить асинхронную функцию в Flask / gunicorn / gevent? - PullRequest
2 голосов
/ 23 мая 2019

В настоящее время у меня есть приложение 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 выполняться асинхронно?

1 Ответ

1 голос
/ 23 мая 2019

Решением может быть запуск 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)
...