Kommunikation zwischen den Arbeitern in uwsgi

Ich bin relativ neu in Python, komm von einem .Net Hintergrund.

Die kurze Version: Wie kann ich ein anwendungsreiches Singleton oder einen anderen Mechanismus erstellen, damit mehrere Threads / Prozesse miteinander kommunizieren können?

Vielleicht bin ich verwöhnt aber in .Net, ich würde einfach etwas in App_Start oder etwas anderes auf der "Applikationsebene" erstellen. Wie kann ich das selbe in python / uwsgi machen?

Die lange Version:

Wir haben eine ruhige API geschrieben mit Django.

Einige der Anrufe erfordern eine Vorverarbeitung und gehen dann zu einem Back-End-System, das langlebige Operationen durchführt.

Der Fluss sieht im Moment so aus …

  • Erhalten Sie die Anforderung, alle Dokumente zu verarbeiten, die mit den angegebenen Kriterien übereinstimmen
  • Api bestimmt, welche Dokumente diesen Kriterien entsprechen (in der Größenordnung von 100.000 – dauert 15-20s)
  • Api generiert eine uuid für diese Batch-Anfrage
  • Api veröffentlicht eine Nachricht an eine Back-End-Warteschlange für jedes dieser Dokumente und verweist auf die Batch-ID.
  • Api hört auf eine andere Warteschlange für "abgeschlossene" Nachrichten und zählt Erfolg / Ausfälle für jede Batch-ID (~ 1-15 Minuten)
  • Während der Verarbeitung wird die Benutzeroberfläche eine Aktualisierung für eine bestimmte Batch-ID anfordern

Wir müssen die Antwort-Warteschlange mit einem anderen Thread zu dem hören, der verwendet wird, um Seiten zu bedienen, da es in einer Warte-Spin-Loop ist …

 while True: self.channel.wait() 

Ich habe damit QueueManager indem ich einen Hinweis auf einen QueueManager der ein Singleton ist. Der Manager schaltet die anfängliche Anforderung ab, zeichnet die Batch-ID auf und überwacht dann in einem zweiten Thread die Warteschlange und aktualisiert den lokalen Status.

Wir kümmern uns nicht wirklich darum, den Zustand langfristig zu bewahren – Wenn die Nachrichten auf der Warteschlange sind, wird die Verarbeitung durch das Back-End durchgeführt und die Zustandsüberwachung ist nur ein Stichwort für den Benutzer, dass die Dinge im Gange sind. Wenn sie sich durchsuchen, verlieren sie auch den Zugriff auf den Status (Batch-ID wird im JS gespeichert)

Dies hatte ein paar Vorteile – wir vermieden eine Datenbank zum Synchronisieren von Informationen (und die damit verbundene Bereinigung). Wir konnten einen einzigen Thread als Nachrichtenverbraucher nutzen und mussten sich nicht um Gleichzeitigkeitsprobleme kümmern, da nur ein Thread jemals Nachrichten sammeln und den lokalen Staat aktualisieren würde.

Also … Jetzt ist es Zeit, es mit uwsgi laufen zu lassen. Ich habe ein großes Problem gefunden. Wenn ich die Anzahl der Prozesse auf 1 setze, funktioniert das Singleton wie erwartet, aber alle Anfragen werden während der 15-20s gesperrt, dass die API Daten verarbeitet. Klar, das ist nicht akzeptabel. Umgekehrt, wenn ich mehrfache Arbeiter drehe, hat jeder sein eigenes Singleton und seinen eigenen Mitteilungshörer – also ist es ziemlich viel zufällig, wenn der Verleger und Verbraucher der gleiche Prozess sind. Und selbst wenn sie sind, wird die Anfrage nach einem Status-Update wahrscheinlich nicht am selben Prozess enden.

Wie kann ich staatliche Informationen zwischen mehreren Arbeitern tauschen? Gibt es eine Möglichkeit, mehrere Threads anstelle von mehreren Arbeitern zu verwenden?

Es scheint, wie ich es wirklich brauche

  • N Threads, jede Serving-Anfragen
  • 1 Thread hört auf die Warteschlange
  • Einige in-Gedächtnis Weise, zwischen ihnen zu kommunizieren

Beachten Sie, ich habe schon --enable-threads aber das scheint nur auf neue Threads anzuwenden, die ich spawn (keine Ahnung, warum das nicht standardmäßig aktiviert wäre)

One Solution collect form web for “Kommunikation zwischen den Arbeitern in uwsgi”

Um mehrere Threads hinzuzufügen, füge einfach hinzu –threads N wobei N die Anzahl der Threads zum spawn ist.

Achten Sie darauf, es funktioniert nur, wenn Sie einen einzelnen Arbeiter / Prozess haben. Ein weiterer gemeinsamer Ansatz ist die Verwendung der uWSGI-Caching-Framework (der Name ist irreführend, infact ist ein gemeinsames Wörterbuch). Es erlaubt Ihnen, Daten zwischen Arbeitern und Threads zu teilen.

  • Was ist der uWSGI-Master-Modus?
  • Warum gibt PyMongo 3 ServerSelectionTimeoutError?
  • Nginx, uwsgi, django und upstream Zeitüberschreitung auf get / post
  • UWSGI - Verschiedene Harakiri Timeout für Django Admin
  • UWSGI AJAX, eine Anforderung lesen
  • Ungültige Transaktion bleibt über Anfragen bestehen
  • Kompilieren fehlgeschlagen mit Fehlercode 1 in / tmp / pip_build_root / uwsgi
  • Super grundlegende uwsgi Konfiguration
  • Unterschied zwischen uwsgi Modul in nginx und uwsgi Server
  • Web2Py auf G-WAN laufen lassen (im Allgemeinen Python's Framework auf G-WAN)
  • Uwsgi wirft IO Fehler verursacht durch uwsgi_response_write_body_do defekte Pfeife
  • Python ist die beste Programmiersprache der Welt.