12 Stimmen

Python Twisted mit Multiprocessing mischen?

Ich muss ein Proxy-ähnliches Programm in Python schreiben, der Arbeitsablauf ist dem eines Web-Proxys sehr ähnlich. Das Programm sitzt zwischen dem Client und dem Server, fängt Anfragen ab, die vom Client an den Server gesendet werden, verarbeitet die Anfrage und sendet sie dann an den ursprünglichen Server. Das verwendete Protokoll ist natürlich ein privates Protokoll, das TCP verwendet.

Um den Aufwand zu minimieren, möchte ich Python Twisted verwenden, um den Empfang von Anfragen (der Teil fungiert als Server) und das erneute Senden (der Teil fungiert als Client) abzuwickeln.

Um die Leistung zu maximieren, möchte ich Python-Multiprocessing verwenden (Threading hat das GIL-Limit), um das Programm in drei Teile (Prozesse) aufzuteilen. Der erste Prozess führt Twisted aus, um Anfragen zu empfangen, die Anfrage in eine Warteschlange zu stellen und den Erfolg sofort an den ursprünglichen Client zurückzugeben. Der zweite Prozess nimmt die Anfrage aus der Warteschlange, verarbeitet sie weiter und stellt sie in eine andere Warteschlange. Der dritte Prozess nimmt die Anfrage aus der zweiten Warteschlange und sendet sie an den ursprünglichen Server.

Ich war ein Newcomer zu Python Twisted, ich weiß, es ist ereignisgesteuert, ich habe auch gehört, es ist besser, nicht Twisted mit Threading oder Multiprocessing zu mischen. Also ich weiß nicht, ob dieser Weg angemessen ist oder gibt es einen eleganteren Weg, indem Sie nur Twisted?

19voto

Glyph Punkte 30137

Twisted hat seine eigene ereignisgesteuerte Art, Subprozesse laufen zu lassen, die (meiner bescheidenen, aber richtigen Meinung nach) besser ist als die multiprocessing Modul. Die Kern-API ist spawnProcess aber Werkzeuge wie Ampulle übergeordnete Wrapper zur Verfügung stellen.

Wenn Sie spawnProcess können Sie die Ausgabe von Unterprozessen auf die gleiche Weise behandeln wie jedes andere Ereignis in Twisted; wenn Sie multiprocessing müssen Sie eine eigene, auf einer Warteschlange basierende Methode entwickeln, um die Ausgabe von einem Unterprozess in die Twisted-Hauptschleife zu bekommen, da die normale callFromThread API, die ein Thread verwenden könnte, funktioniert nicht in einem anderen Prozess. Je nachdem, wie Sie ihn aufrufen, wird er entweder versuchen, den Reaktor zu picken, oder einfach einen anderen, nicht funktionierenden Reaktor im Unterprozess verwenden; so oder so wird er Ihren Aufruf für immer verlieren.

4voto

nosklo Punkte 204121

ampoule ist das erste, was ich denke, wenn ich Ihre Frage lese.

Es handelt sich um eine einfache Prozesspool-Implementierung, die die AMP-Protokoll zu kommunizieren. Sie können die deferToAMPProcess Funktion ist sie sehr einfach zu bedienen.

0voto

kkszysiu Punkte 537

Sie können so etwas wie die kooperative Multitasking-Technik ausprobieren, die dort beschrieben wird http://us.pycon.org/2010/conference/schedule/event/73/ . Die Technik ist ähnlich wie die von Glyph beschriebene und ist einen Versuch wert.

Sie können versuchen, ZeroMQ mit Twisted zu verwenden, aber das ist wirklich schwierig und im Moment noch experimentell :)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X