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