Was ist der beste Weg, um einen Pool von Arbeitsprozessen zu implementieren, die mit Gevent kompatibel sind?
-
27-10-2019 - |
Frage
Szenario
Ich habe einen Serverprozess in Python und Gevent implementiert, der eine Verbindung zu einem Backend -Dienst über TCP/IP herstellt und viele Web -Clients (~ 1000 pro Prozess) mit schnell ändernden dynamischen Inhalten basiert, basierend auf den vom Backend -Dienst bereitgestellten Änderungen. Der Dienst wird auf Ubuntu 10.04 ausgeführt und wird nicht unter Windows ausgeführt, sodass die Zielplattform behoben ist. Wir verwenden derzeit Python 2.6.6.
Problem
Wenn Sie die Änderungen an so vielen Clients bedienen, können Sie eine Verzögerung bei der Verarbeitung der vom Backend gesendeten Änderungen verursachen. Mein Plan ist daher, den Server in mehrere Prozesse zu teilen. Eine Reihe von Arbeitsprozessen würde den Web -Clients bedienen, während der Hauptprozess weiterhin mit dem Backend -Service verbunden wäre. Ich verwende bereits einen separaten Pool von Greenlets, um den Web -Clients zu bedienen, aber sie müssen in Arbeitsprozesse eingesetzt werden.
Frage
Könnten Sie mich bitte auf eine Implementierung des Arbeitsprozesses für Gevent verweisen oder herausfinden.
Beschränkungen
Ich möchte vermeiden, Python -Fäden in unsere Prozesse einzuführen, da dies Raum für GIL -Streit geben würde, was die Leistung durch Einführung von Latenzen verringern würde. Es wäre also eine saubere Multiprocessing + Gevent -Lösung, wenn möglich.
Lösung
Ich empfehle einen Blick auf Sellerie - Verteilte Aufgabenverarbeitungssystem in Python geschrieben.
Die Grundidee mit celery
ist, dass Sie eine Warteschlange haben (entweder RabbitMQ
oder Redis
) mit Arbeitern als Python -Prozesse und über die ausgesetzt celeryd
Dämon. Nach der Sellerie -Dokumentation, celeryd
Unterstützt das Laufen gevent
Modus auch (für Netzwerk -I/A -Prozesse), sodass Ihr Worker -Code vermutlich nicht viel Änderung benötigt, um in dieser Umgebung ausgeführt zu werden.
Andere Tipps
Ich würde einen benutzerdefinierten Socket IPC in Betracht ziehen oder Nulomq verwenden.