Comment implémenter le threading avec flask sur heroku [duplicate]
Sep 04 2020
J'ai le code suivant pour tester l'exécution de deux threads avec flask sur heroku.
app.py
from flask import Flask, render_template
import threading
import time
import sys
app = Flask(__name__, static_url_path='')
test_result = 'failed'
@app.route('/')
def index():
return 'Hello! Server is running'
@app.route('/thread-test')
def thread_test():
global test_result
return test_result
def thread_testy():
time.sleep(10)
global test_result
test_result = 'passed'
return
if __name__ == "__main__":
threading.Thread(target=app.run).start()
threading.Thread(target=thread_testy).start()
Procile
web: gunicorn app:app --log-file=-
Cela renvoie «passé» localement, mais «échoué» sur heroku. Quelqu'un a des idées sur la façon de faire fonctionner ce test?
Réponses
JesseRezaKhorasanee Sep 05 2020 at 00:52
Ok, après de nombreux essais et erreurs, j'ai finalement trouvé une solution à cela. La clé est de démarrer votre nouveau thread @app.before_first_requestau lieu de dans __main__.
app.py
from flask import Flask, render_template
import threading
import time
import sys
app = Flask(__name__, static_url_path='')
test_result = 'failed'
@app.before_first_request
def execute_this():
threading.Thread(target=thread_testy).start()
@app.route('/')
def index():
return 'Hello! Server is running successfully'
@app.route('/thread-test')
def thread_test():
global test_result
return test_result
def thread_testy():
time.sleep(10)
print('Thread is printing to console')
sys.stdout.flush()
global test_result
test_result = 'passed'
return
def start_app():
threading.Thread(target=app.run).start()
if __name__ == "__main__":
start_app()
Ce qui précède renvoie le succès à / thread-test après 10 s