Was ist der beste Weg, um einen Pool von Arbeitsprozessen zu implementieren, die mit Gevent kompatibel sind?

StackOverflow https://stackoverflow.com/questions/5360050

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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top