1. Einführung
Sellerie (Sellerie) ist eine asynchrone Aufgabenwarteschlange/Jobwarteschlange, die auf verteiltem Messaging basiert. Der Schwerpunkt liegt auf Echtzeitvorgängen, bietet aber auch eine gute Planungsunterstützung.
Sellerie wird in Produktionssystemen verwendet, um jeden Tag Millionen von Aufgaben zu erledigen.
Sellerie ist in Python geschrieben, aber das Protokoll kann in jeder Sprache implementiert werden. Es kann auch mit anderen Sprachen über Webhooks implementiert werden.
Der empfohlene Nachrichtenbroker ist RabbitMQ, bietet jedoch begrenzte Unterstützung für Redis, Beanstalk, MongoDB, CouchDB und Datenbanken (mit SQLAlchemy oder Django ORM).
Celery lässt sich leicht in Django, Pylons und Flask integrieren. Verwenden Sie einfach die Zusatzpakete django-celery, celery-pylons und Flask-Celery.
2. Installation
Mit den oben genannten Konzepten müssen Sie mehrere Dinge installieren: RabbitMQ, SQLAlchemy, Celery
Die Installationsmethode ist auch sehr einfach: RabbitMQ:
Mac:
brew install rabbitmq
Linux:
sudo apt-get install rabbitmq-server
Die restlichen beiden sind alles Python-Dinge. Installieren Sie sie einfach direkt mit pip. Schüler, die den MySQL-Treiber noch nie installiert haben, müssen möglicherweise MySQL-Python installieren.
Nachdem die Installation abgeschlossen ist, starten Sie den Dienst:
$ rabbitmq-server[回车]
Schließen Sie das Fenster nach dem Start nicht, sondern gehen Sie zum Erstellen wie folgt vor ein neues Fenster (Tab)
3. Einfacher Fall
Stellen Sie sicher, dass Ihr vorheriges RabbitMQ gestartet wurde.
Immer noch das Beispiel auf der offiziellen Website: Erstellen Sie in einem beliebigen Verzeichnis eine Datei „tasks.py“ mit folgendem Inhalt:
from celery import Celery app = Celery('tasks', broker='amqp://guest@localhost//') @app.task def add(x, y): return x + y
at Verzeichnisausführung auf gleicher Ebene:
$ celery -A tasks worker --loglevel=info
Dieser Befehl bedeutet, einen Worker zu starten und die Aufgaben hinzuzufügen (add(x,y)). Aufgaben Die Aufgabe wird in die Warteschlange gestellt.
Lassen Sie das Fenster geöffnet und öffnen Sie ein neues Fenster, um in den interaktiven Modus, Python oder Ipython, zu wechseln:
>>> from tasks import add >>> add.delay(4, 4)
So weit ist das möglich Verwenden Sie Sellerie, um die Aufgabe auszuführen. Die Add-Aufgabe wird einfach im obigen Python-Interaktionsmodus aufgerufen und die 4, 4 Parameter werden übergeben.
Zu diesem Zeitpunkt liegt jedoch ein Problem vor. Sie möchten plötzlich die Ausführungsergebnisse und den Status dieser Aufgabe wissen und wissen, ob sie abgeschlossen ist oder nicht. Daher müssen Sie ein Backend einrichten.
Ändern Sie den Code in task.py vorher:
# coding:utf-8 import subprocess from time import sleep from celery import Celery backend = 'db+mysql://root:@192.168.0.102/celery' broker = 'amqp://guest@192.168.0.102:5672' app = Celery('tasks', backend=backend, broker=broker) @app.task def add(x, y): sleep(10) return x + y @app.task def hostname(): return subprocess.check_output(['hostname'])
Zusätzlich zum Hinzufügen eines Backends wird oben auch ein Who hinzugefügt. Die Methode wird zum Testen des Multi-Server-Betriebs verwendet. Nachdem die Änderung abgeschlossen ist, wird sie weiterhin wie zuvor gestartet.
Geben Sie auf ähnliche Weise das Python-Interaktionsmodell ein:
>>> from tasks import add, hostname >>> r = add.delay(4, 4) >>> r.ready() # 10s内执行,会输出False,因为add中sleep了10s >>> >>> r = hostname.delay() >>> r.result # 输出你的hostname
4. Das Testen mehrerer Server
ist abgeschlossen Nach dem obigen Test kam es zu Zweifeln an der Bezeichnung „verteiltes Aufgabenmanagement“. Wo ist also seine Verteilung? Wie werden seine Aufgaben wahrgenommen? Auf welcher Maschine wurde es ausgeführt?
Ohne den Sellery-Dienst auf dem aktuellen Server herunterzufahren, installieren Sie Celery auf die gleiche Weise auf einem anderen Server und starten Sie es:
$ celery -A tasks worker --loglevel=info
Es wurde festgestellt, dass der Celery-Dienst des vorherigen Servers den Hostnamen des gerade gestarteten Servers ausgibt, sofern der Server mit Ihrem Rabbitmq verbunden ist.
Dann rufen Sie den interaktiven Python-Modus auf:
>>> from tasks import hostname >>> >>> for i in range(10): ... r = hostname.delay() ... print r.result # 输出你的hostname >>>
Sehen Sie sich an, was Sie eingegeben haben, und beobachten Sie, wie Sie den Selleriedienst auf den beiden gestartet haben Server.
5. Probleme mit der RabbitMQ-Remoteverbindung
Während des ersten Tests konnte sich der Remote-Server nicht mit dem lokalen RabbitMQ-Dienst verbinden in /usr/local/etc/rabbitmq Ändern Sie in der Datei /rabbitmq-env.conf die IP in NODE_IP_ADDRESS=127.0.0.1 in 0.0.0.0.
6. Zusammenfassend
Dieser Artikel stellt kurz die Verwendung von Sellerie vor, wobei der Schwerpunkt immer noch auf der verteilten Verwendung liegt. Der unangenehme Teil ist, dass Sie beim Erweitern den Code (tasks.py) erneut bereitstellen müssen, anstatt die Aufgaben direkt zu teilen. Vielleicht verwendet Celery Aufgaben, um verschiedene Arbeiter abzugleichen? Ich weiß noch nicht viel darüber, ich werde darüber sprechen, nachdem ich es ausführlich verwendet habe.
Weitere verwandte Artikel zur Installation und Verwendung des asynchronen Aufgabenwarteschlangenpakets Celery in der Python-Umgebung finden Sie auf der chinesischen PHP-Website!