Как работать с фоновыми потоками в flask?

#python #flask

#python #flask

Вопрос:

Мне нужно выполнить вычисление в режиме повышенной нагрузки, и из-за тайм-аута шлюза я хочу запустить вычисление в фоновом потоке.
Я использовал python threading, но он не работает.

 import time
import threading
from flask import Flask
from flask_cors import CORS

app = Flask(__name__)
CORS(app)

def heavy_func():
    time.sleep(20)
    print('Hi!')

@app.route('/', methods=['GET'])
def get_method():
    threading.Thread(target=heavy_func()).start()
    return 'hello!'

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

он работает синхронно, а не асинхронно, как я хочу

Ответ №1:

Используйте thread.daemon следующим образом.

 import time
import threading
from flask import Flask
from flask_cors import CORS

app = Flask(__name__)
CORS(app)

def heavy_func():
    time.sleep(20)
    print('Hi!')

@app.route('/', methods=['GET'])
def get_method(): 
    thread = threading.Thread(target=heavy_func)
    thread.daemon = True         # Daemonize 
    thread.start()
    return "work is in progress"
if __name__ == '__main__':
    app.run(host='0.0.0.0', debug=True, threaded=True),

🤓
  

Ответ №2:

Существует несколько способов запуска асинхронного потока в Flask. Я написал небольшую статью об этом https://smirnov-am.github.io/background-jobs-with-flask

Комментарии:

1. не удается установить uWSGI в Windows

2. поэтому я не могу проверить это на своем локальном компьютере

3. разве мы не должны использовать app.app_context().push() в tasks.py ?