Alternativ zu einer while-Schleife in Twisted, die nicht blockiert den Reaktor-Thread

Ich mache eine Chat-Anwendung in Twisted. Angenommen, mein Server ist so konzipiert, dass er, wenn er einen Client online erkennt, den Client alle ausstehenden Nachrichten sendet (die Nachrichten dieses Clients, die in einer Python-Liste auf dem Server zwischengespeichert wurden, weil es offline war) By-one in einer while-Schleife, bis die Liste erschöpft ist. Etwas wie das:

class MyChat(LineReceiver): def connectionMade(self): self.factory.clients.append(self) while True: #retrieve first message from a list of pending-messages(queue) of "self" msg = self.retrieveFromQueue(self) if msg != "empty": self.transport.write(msg) else: break def lineReceived(self, line): ... def connectionLost(self, reason): ... def retrieveFromQueue(self, who): msglist = [] if who in self.factory.userMessages: msglist = self.factory.userMessages[who] if msglist != []: msg = msglist.pop(0) #msglist is a list of strings self.factory.userMessages[self] = msglist return msg else: return "empty" factory.userMessages = {} #dict of list of incoming messages of users who aren't online 

Also nach meinem Verständnis von Twisted, wird die while-Schleife blockieren die wichtigsten Reaktor-Thread und jede Interaktion von jedem anderen Client mit dem Server wird nicht vom Server registriert werden. Wenn das der Fall ist, möchte ich einen alternativen Code / eine Methode zu diesem Ansatz, der den Twisted Thread nicht blockiert.

Update: Möglicherweise gibt es 2000-3000 anstehende Nachrichten pro Benutzer wegen der Art der App.

One Solution collect form web for “Alternativ zu einer while-Schleife in Twisted, die nicht blockiert den Reaktor-Thread”

Ich denke, dass https://glyph.twistedmatrix.com/2011/11/blocking-vs-rs-

Die Antwort hier hängt davon ab, was genau self.retrieveFromQueue(self) tut. Du hast gesagt, es ist so etwas wie:

 if self.list_of_messages: return self.list_of_messages.pop(0) return b"empty" 

Wenn dies der Fall ist, dann ist die Antwort eine Sache. Auf der anderen Seite, wenn die Umsetzung etwas ähnliches ist:

 return self.remote_mq_client.retrieve_queue_item(self.queue_identifier) 

Dann könnte die Antwort etwas ganz anderes sein. Allerdings ist zu beachten, dass es die Implementierung von retrieveFromQueue auf die die Antwort zu scheinen scheint.

Dass es eine while , ist nicht ganz so wichtig. Die while Schleife spiegelt die Tatsache wider, dass (um Glyphs Worte zu benutzen), dieser Code wird Arbeit erledigt .

Sie können entscheiden, dass die Menge der Arbeit, die diese Schleife darstellt, zu groß ist, um alle zu einem Zeitpunkt fertig zu werden. Wenn es Hunderte von Millionen von in der Warteschlange befindlichen Nachrichten gibt, dann kopiert sie eins nach dem anderen in den Sendepuffer der Verbindung wird wahrscheinlich sowohl eine bemerkenswerte Menge an Zeit und Speicher verwenden. In diesem Fall möchten Sie vielleicht den Hersteller / Konsumentenmuster und seine Unterstützung in Twisted betrachten . Dies wird nicht den Code nicht weniger (oder mehr) "blockieren", aber es wird es für kürzere Zeiträume zu einem Zeitpunkt laufen lassen.

Also die Fragen hier zu beantworten sind wirklich:

  • Ob oder nicht retrieveFromQueue Blöcke
  • Wenn es nicht blockiert, ob es so viele in der Warteschlange befindliche Nachrichten gibt, die sie verarbeiten, wird die connectionMade dazu veranlasst, so lange zu laufen, dass andere Clients eine Störung im Dienst bemerken
  • Verwenden von InlineCallbacks
  • Python - Twisted, Proxy und Änderungsinhalt
  • Holen Sie Scrapy Crawler-Ausgabe / Ergebnisse in Skript-Datei-Funktion
  • 2 SSL Zertifikate in verdreht
  • HTTP Download sehr große Datei
  • Was ist der praktische Unterschied zwischen xml, json, rss und Atom bei der Anbindung an Twitter?
  • Python verdrehte JSON RPC
  • Python, rufe eine Klassenfunktion aus einer anderen Klasse an
  • Mehrfach-Thread mit Autobahn, ApplicationRunner und ApplicationSession
  • Beste Weg, um Remote-Befehle durch ssh in Twisted laufen?
  • Kann man in eine UDP-Buchse schreiben?
  • Python ist die beste Programmiersprache der Welt.