[PYTHON] Traitement asynchrone du céleri dans Flask

introduction

J'écrivais une simple application python avec Flask. J'ai donc voulu ajouter un traitement asynchrone. Cependant, il y avait certains points dans lesquels je me suis retrouvé coincé, alors j'ai écrit un article. Une chose que je peux dire en premier est que le traitement asynchrone en python peut être meilleur avec un framework non Flask. Lorsque j'ai été recherché sur Google, j'ai senti que les autres cadres contenaient plus d'informations.

Contenu d'exécution

L'utilisateur tape deux nombres dans la zone de texte et appuie sur un bouton. Le côté serveur effectue l'opération d'ajout des deux nombres dans un processus asynchrone et renvoie immédiatement une réponse à l'utilisateur.

Environnement d'exécution

os: Windows10 redis Redis-x64-3.0.504.msi

python 3.5.6 (Anaconda) Flask==1.1.1 celery==3.1.25 redis==2.10.6

Procédure d'exécution

Point de trébuchement

―― Puisque les versions de céleri et de redis sont compatibles, vérifiez-les d'abord.

--Vérifiez si la fonction à traiter de manière asynchrone est enregistrée dans la tâche du céleri. (Peut être confirmé sur le terminal où "céleri -A sample.cellery worker -l info" est exécuté)

en conclusion

C'est facile, mais j'ai joint sample.py et main.html ci-dessous. Cela fonctionne avec ces deux fichiers. J'ai également joint l'URL du site auquel j'ai fait référence.

Si vous avez des questions ou des erreurs, veuillez commenter.

Code source

sample.py


# coding=utf-8
from flask import Flask, render_template, request

#Préparation de l'application Flask
app = Flask("sample")

# this is a part of celery property to use in Flask
from celery import Celery
def make_celery(app):
    celery = Celery(
        app.import_name,
        backend=app.config['CELERY_RESULT_BACKEND'],
        broker=app.config['CELERY_BROKER_URL']
    )
    celery.conf.update(app.config)

    class ContextTask(celery.Task):
        def __call__(self, *args, **kwargs):
            with app.app_context():
                return self.run(*args, **kwargs)

    celery.Task = ContextTask
    return celery

# update flask config to use celery
app.config.update(
    CELERY_BROKER_URL='redis://localhost:6379',
    CELERY_RESULT_BACKEND='redis://localhost:6379'
)
celery = make_celery(app)

@celery.task()
def add(a, b):
    print(a + b)
    return a + b

@app.route('/', methods=["GET", "POST"])
def sample():

    #Traitement au POST
    if request.method == 'POST':
        return render_template(
            'main.html',  #Fichier HTML à afficher
            )

    #Traitement au moment de GET
    else:
        return render_template(
            'main.html',  #Fichier HTML à afficher
            )

@app.route('/celery', methods=["POST"])
def celery_test():

    if request.method == 'POST':
        a = int(request.form["num_one"])
        b = int(request.form["num_two"])
        result = add.delay(a,b)
        return render_template(
                'main.html',  #Fichier HTML à afficher
                )

if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0', port=9000)

main.html


<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8"/>
    <title>Sample</title>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
  </head>
 
  <body>      
    <div class="container">
      <div class="jumbotron">
        <h1>
          <p align="center">
            <font size="10">Traitement asynchrone du flacon</font>
          </p>
        </h1>
      </div>

      <form class="" method="post" action="/celery" enctype="multipart/form-data">
        <div class="container" style="text-align: center;">
          <input type="number" name="num_one">  +  
          <input type="number" name="num_two">
        </div>

        <div class="button_wrapper" style="text-align: center;">
          <button type="submit" class="btn btn-lg btn-success" style="margin-top: 50px; ">Exécution du calcul</button>
        </div>

      </form>
    </div> 

  </body>
</html>

Les références

Installez Redis pour Windows et essayez-le http://kageura.hatenadiary.jp Flacon officiel https://flask.palletsprojects.com/en/1.0.x/patterns/celery/ python - Impossible de lancer Celery Worker https://codeday.me/jp/qa/20190525/900758.html celery AttributeError: 'str' object has no attribute 'items' django Day14 http://www.programmersought.com/article/8120463251/

Recommended Posts

Traitement asynchrone du céleri dans Flask
Implémentation du traitement asynchrone dans Django (Celery, Redis)
Traitement asynchrone (threading) en python
À propos du traitement des paramètres dans le fichier request.args de Flask
Traitement asynchrone à l'aide de Linebot dans la file d'attente des travaux
Traitement multithread en python
Traitement de texte avec Python
Traitement des requêtes en Python
Téléchargeur d'images avec Flask
Variables d'environnement HTTP dans Flask
Collection de traitement d'image en Python
Traitement asynchrone avec LINE BOT: RQ (Redis Queue) en Python
Utilisation du mode Python dans le traitement
Télécharger plusieurs fichiers avec Flask
Flux d'obtention du résultat du traitement asynchrone à l'aide de Django et Celery
Ordre de traitement lors du chaînage dans PySpark
Traitement du signal en Python (1): transformée de Fourier
Créer un lecteur CSV avec Flask
100 Language Processing Knock Chapitre 1 en Python
Papier: Traitement intracérébral de la musique
Correction d'Apscheduler fonctionnant deux fois dans Flask
Notes de traitement par lots dans IPython Notebook
Meilleures pratiques pour les fichiers de configuration dans Flask
J'ai essayé le traitement asynchrone en utilisant asyncio