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.
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.
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
Exécutez "python sample.py" avec Anaconda Prompt.
Exécutez "céleri -A sample.cellery worker -l info" dans Anaconda Prompt.
Accédez à localhost: 9000, saisissez un nombre dans la zone de texte et appuyez sur Exécuter le calcul.
En conséquence, une réponse est renvoyée immédiatement. Confirmez que le résultat du calcul est affiché dans l'invite Anaconda qui a exécuté le céleri.
―― 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é)
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.
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>
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