[PYTHON] Sellerie asynchrone Verarbeitung in Flask

Einführung

Ich habe mit Flask eine einfache Python-Anwendung geschrieben. Also wollte ich asynchrone Verarbeitung hinzufügen. Es gab jedoch einige Punkte, in denen ich feststeckte, also schrieb ich einen Artikel. Eine Sache, die ich zuerst sagen kann, ist, dass die asynchrone Verarbeitung in Python mit einem Nicht-Flask-Framework möglicherweise besser ist. Als ich gegoogelt wurde, hatte ich das Gefühl, dass andere Frameworks mehr Informationen hatten.

Ausführungsinhalt

Der Benutzer gibt zwei Zahlen in das Textfeld ein und drückt eine Taste. Die Serverseite führt den Vorgang des Hinzufügens der beiden Nummern in einem asynchronen Prozess aus und gibt sofort eine Antwort an den Benutzer zurück.

Ausführungsumgebung

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

Ausführungsverfahren

Stolperpunkt

――Da die Versionen von Sellerie und Redis kompatibel sind, überprüfen Sie diese zuerst.

--Überprüfen Sie, ob Redis bei localhost ausgeführt wird: 6397.

--Überprüfen Sie, ob die asynchron zu verarbeitende Funktion in der Aufgabe Sellerie registriert ist. (Kann auf dem Terminal bestätigt werden, auf dem "Sellerie - Ein Beispiel.

abschließend

Es ist einfach, aber ich habe unten sample.py und main.html angehängt. Es funktioniert mit diesen beiden Dateien. Ich habe auch die URL der Site angehängt, auf die ich verwiesen habe.

Wenn Sie Fragen oder Fehler haben, kommentieren Sie bitte.

Quellcode

sample.py


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

#Vorbereitung der Kolben-App
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():

    #Verarbeitung bei POST
    if request.method == 'POST':
        return render_template(
            'main.html',  #HTML-Datei zum Anzeigen
            )

    #Verarbeitung zum Zeitpunkt von GET
    else:
        return render_template(
            'main.html',  #HTML-Datei zum Anzeigen
            )

@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',  #HTML-Datei zum Anzeigen
                )

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">Asynchrone Verarbeitung des Kolbens</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; ">Berechnungsausführung</button>
        </div>

      </form>
    </div> 

  </body>
</html>

Verweise

Installieren Sie Redis für Windows und probieren Sie es aus http://kageura.hatenadiary.jp Flaschenbeamter https://flask.palletsprojects.com/en/1.0.x/patterns/celery/ Python - Sellerie-Worker kann nicht gestartet werden 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

Sellerie asynchrone Verarbeitung in Flask
Implementierung der asynchronen Verarbeitung in Django (Sellerie, Redis)
Asynchrone Verarbeitung (Threading) in Python
Informationen zur Parameterverarbeitung in Flask's request.args
Asynchrone Verarbeitung mit Linebot in der Jobwarteschlange
Multithread-Verarbeitung in Python
Textverarbeitung mit Python
Verarbeitung in Python beenden
Bild-Uploader mit Flasche
HTTP-Umgebungsvariablen in Flask
Bildverarbeitungssammlung in Python
Asynchrone Verarbeitung mit LINE BOT: RQ (Redis Queue) in Python
Verwenden des Python-Modus in der Verarbeitung
Hochladen mehrerer Dateien mit Flask
Ablauf des Ergebnisses der asynchronen Verarbeitung mit Django und Sellerie
Verarbeitungsreihenfolge beim Verketten im PySpark
Signalverarbeitung in Python (1): Fourier-Transformation
Erstellen Sie mit Flask einen CSV-Reader
100 Sprachverarbeitung Knock Kapitel 1 in Python
Papier: Intrazerebrale Verarbeitung von Musik
Problem, bei dem Apscheduler zweimal in Flask ausgeführt wurde - gefixt
Notizen zur Stapelverarbeitung in IPython Notebook
Best Practices für Konfigurationsdateien in Flask
Ich habe versucht, asynchrone Verarbeitung mit Asyncio