Warteschlange remote-Anrufe auf einer Python-Twisted-Perspektive broker?
Die Stärke von Twisted (für python) ist die asynchrone framework (denke ich). Ich habe geschrieben, ein image-processing-server nimmt Anfragen über Perspektive Broker. Es funktioniert sehr gut, solange ich füttere Sie weniger als ein paar hundert Bilder auf einmal. Allerdings ist es manchmal gespickt mit Hunderten von Bildern in nahezu der gleichen Zeit. Weil es versucht, alle zu verarbeiten, die gleichzeitig der server abstürzt.
Als Lösung würde ich gerne in die Warteschlange der remote_calls auf dem server, so dass es nur Prozesse ~100 Bilder gleichzeitig. Es scheint so, das könnte etwas sein, das Verdreht schon funktioniert, aber ich kann nicht scheinen, um es zu finden. Irgendwelche Ideen auf, wie zu Beginn der Umsetzung dieser? Ein Punkt in die richtige Richtung? Danke!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einer ready-made-option, die helfen könnte, mit dieser ist
twisted.internet.defer.DeferredSemaphore
. Dies ist die asynchrone version der normalen (zählen) der semaphore, die Sie vielleicht bereits wissen, wenn Sie haben viel getan, threaded Programmierung.A (zu zählen) ein semaphor ist ein viel wie ein mutex (eine Sperre). Aber wo ein mutex kann nur einmal erworben werden, bis eine entsprechende Freigabe ein (zählen), semaphore kann so konfiguriert werden, erlauben eine beliebige (aber festgelegte) Anzahl von Akquisitionen erfolgreich zu sein, bevor die entsprechenden Veröffentlichungen sind erforderlich.
Hier ist ein Beispiel für die Verwendung
DeferredSemaphore
laufen zehn asynchrone Operationen, aber die laufen bei den meisten drei von Ihnen auf einmal:DeferredSemaphore
auch explizitacquire
undrelease
Methoden, aber dierun
Methode ist so bequem, es ist fast immer was Sie wollen. Es ruft dieacquire
Methode, die gibt einenDeferred
. Den erstenDeferred
es fügt einen callback, welche die Funktion aufruft, Sie übergeben (ggf. zusammen mit positions-oder keyword-Argumenten). Wenn diese Funktion gibt eineDeferred
, dann das zweiteDeferred
wird ein callback Hinzugefügt, die fordert, dierelease
Methode.Synchronen Fall wird behandelt, indem sofort aufrufen
release
. Fehler werden auch behandelt, indem Sie propagieren, sondern dafür, dass die notwendigenrelease
getan wird, lassen Sie dieDeferredSemaphore
in einem konsistenten Zustand. Das Ergebnis der Funktion übergebenrun
(oder das Ergebnis derDeferred
es gibt) wird das Ergebnis derDeferred
zurückgegebenrun
.Ein weiterer möglicher Ansatz könnte sein, basierend auf
DeferredQueue
undcooperate
.DeferredQueue
ist meist wie eine normale Schlange, aber seineget
Methode gibt eineDeferred
. Wenn es passiert, werden keine Elemente in der queue, die zur Zeit des Aufrufs, dieDeferred
wird nicht ausgelöst, bis ein Element Hinzugefügt wird.Hier ein Beispiel:
Beachten Sie, dass die
async
worker-Funktion ist die gleiche wie die aus dem ersten Beispiel. Dieses mal jedoch, es gibt auch eineworker
Funktion, die explizit ziehen Arbeitsplätze aus derDeferredQueue
Bearbeiten mitasync
(durch hinzufügenasync
als ein Rückruf derDeferred
zurückgegebenget
). Dieworker
generator angetrieben durchcooperate
, denen geht es einmal nach jedemDeferred
es ergibt sich feuert. Die main-loop dann startet diese drei worker-Generatoren, so dass drei Arbeitsplätze in progress zu einem bestimmten Zeitpunkt.Dieser Ansatz beinhaltet, dass ein bisschen mehr code, als die
DeferredSemaphore
Ansatz, hat aber einige Vorteile, die interessant sein können. Zuerstcooperate
gibt eineCooperativeTask
Instanz, die nützliche Methoden, wiepause
,resume
, und ein paar andere. Außerdem werden alle Aufträge zugewiesen, die gleiche Mitarbeiterin, wird kooperieren mit einander in Planung, so dass nicht zu überlasten die Ereignis-Schleife (und dies ist, was gibt die API auch seinen Namen). Auf derDeferredQueue
Seite, ist es auch möglich, Grenzen zu setzen, wie viele Artikel sich derzeit in Bearbeitung, so können Sie vermeiden, vollständig überlastung Ihrer server (zum Beispiel, wenn Sie Ihre Bild-Prozessoren stecken und stop, Erledigung von Aufgaben). Wenn der code ruftput
verarbeitet die queue-überlauf-Ausnahme, Sie können verwenden Sie diese als Druck, um zu versuchen zu stoppen, keine neuen Arbeitsplätze (vielleicht rangieren Sie auf einem anderen server, oder Alarmierung ein administrator). Ähnliche Dinge tut mitDeferredSemaphore
ist ein bisschen schwieriger, da es keine Möglichkeit zu begrenzen, wie viele Arbeitsplätze warten zu können, erwerben die semaphore.Vielleicht möchten Sie auch die txRDQ (Größenveränderlich Dispatch-Warteschlange), schrieb ich. Google es, ist es in der Texas-Sammlung auf LaunchPad. Sorry, ich habe nicht mehr Zeit zu Antworten - etwa auf die Bühne zu gehen.
Terry