Django Asynchrone Verarbeitung
Ich habe eine Reihe von Django-requests, die führt einige mathematische Berechnungen ( in C geschrieben und ausgeführt werden, die über eine Cython-Modul ), die in einer unbestimmten Menge ( in der Größenordnung von 1 Sekunde ) der Zeit für die Ausführung. Auch die Anfragen, die nicht benötigen Zugriff auf die Datenbank und sind alle unabhängig voneinander und Django.
Recht jetzt alles synchron ( mit Gunicorn mit sync
Arbeiter-Typen ), aber ich würde gerne machen das die asynchrone und nichtblockierende. Kurz gesagt ich möchte auch etwas zu tun:
- Empfangen der AJAX-Anfrage
- Zuweisen-Aufgabe an einen verfügbaren Arbeiter ( ohne die Blockierung der wichtigsten Django-web-Anwendung )
- Arbeiter führt die Aufgabe in irgendeiner unbekannten Zeit
- Django liefert das Ergebnis der Berechnung (eine Liste von strings) als JSON, wenn die Aufgabe abgeschlossen ist,
Ich bin ganz neu asynchrone Django, und so ist meine Frage was ist der beste stack, dies zu tun.
Ist diese Art von Prozess-etwas, das eine task-queue ist gut geeignet für? Würde jemand empfehlen, Tornado + Sellerie + RabbitMQ, oder vielleicht etwas anderes?
Vielen Dank im Voraus!
- Was tun Sie mit den Ergebnissen der Berechnungen?
- Das Ergebnis (JSON) an den browser des Benutzers.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sellerie wäre perfekt für diese.
Da das, was Sie tun, ist relativ einfach (sprich: Sie brauchen keine komplexen Regeln, wie Sie die Aufgaben, die weitergeleitet werden soll), Sie könnten wahrscheinlich Weg mit Hilfe der Redis-backend, das heißt, Sie brauchen nicht, um das setup/configure RabbitMQ (welches, meiner Erfahrung nach, ist das schwieriger).
Ich verwenden Redis mit den meisten ein dev-build von Sellerie, und hier sind die relevanten bits von meine config:
Ich bin auch mit
django-celery
, wodurch die integration mit Django glücklich.Kommentar, wenn Sie weitere spezifische Beratung.
gevent
+ monkey-patching mit Sellerie, so dass, wenn Sie verwenden diegevent
gunicorn Arbeiter und monkeypatchcelery
sollte alles nur magisch werden asynchron.gevent
Arbeitnehmer + monkey-patching in der Vergangenheit, aber es verlangsamt meinen Antrag auf ein Schneckentempo. Ich vermute, die aufgrund meiner Sperrung Verbindung mit MySQL. Würde ich verschieben müssen, um zu einer anderen Datenbank?gevent
- und andere Datenbanken, so konnte ich nicht sagen. Vielleicht post eine andere Frage zu Fragen über, die?my_task.apply(…)
, die Django-thread blockieren würde warten, für die Aufgabe abzuschließen. Dies könnte dann Sinn machen, wenn, zum Beispiel, die Aufgabe ist schwer CPU-gebunden... Aber es ist nicht frei, die Django-thread.Da Sie planen, um es async (vermutlich mit so etwas wie gevent), könnte man auch in Erwägung ziehen, eine Gewinde/Gabel-backend-web-service für die rechnerische Arbeit.
Den async-frontend-server bewältigen konnten alle das Licht arbeiten, erhalten Daten aus Datenbanken, geeignet für asynchrone (redis oder mysql mit einem speziellen Treiber), etc. Wenn eine Berechnung durchgeführt werden, die frontend-server veröffentlichen können alle input-Daten an den backend-server abrufen und das Ergebnis, wenn die backend-server erfolgt computing.
Seit der frontend-server ist asynchron, es wird nicht blockiert, während der Wartezeit für die Ergebnisse. Der Vorteil im Gegensatz zur Verwendung von Sellerie, ist, dass man das Ergebnis an den client, sobald Sie verfügbar sind.