Tornado ein Handler Blöcke für einen anderen

Mit python / tornado wollte ich einen kleinen "trampolin" -Server aufbauen, der es zwei Geräten ermöglicht, sich in einer rustikalen Weise miteinander zu kommunizieren. Es gibt wahrscheinlich weit überlegene / einfachere "off the shelf" Möglichkeiten, dies zu tun. Ich würde diese Vorschläge begrüßen, aber ich habe immer noch das Gefühl, es wäre pädagogisch, um herauszufinden, wie man meine eigenen mit Tornado zu tun.

Grundsätzlich war die Idee, dass ich das Gerät in der Rolle des Servers hätte, der eine Langzeit mit einem GET macht. Das Client-Gerät würde POST auf den Server, an welchem ​​Punkt der POST-Körper als Antwort des blockierten GET übertragen würde. Bevor der POST reagierte, würde er blockieren. Die Serverseite macht dann einen PUT mit der Antwort, die auf den gesperrten POST übertragen wird und zum Gerät zurückkehrt. Ich dachte, vielleicht könnte ich das mit tornado.queues machen. Aber das scheint nicht geklappt zu haben. Mein Code:

import tornado import tornado.web import tornado.httpserver import tornado.queues ToServerQueue = tornado.queues.Queue() ToClientQueue = tornado.queues.Queue() class Query(tornado.web.RequestHandler): def get(self): toServer = ToServerQueue.get() self.write(toServer) def post(self): toServer = self.request.body ToServerQueue.put(toServer) toClient = ToClientQueue.get() self.write(toClient) def put(self): ToClientQueue.put(self.request.body) self.write(bytes()) services = tornado.web.Application([(r'/query', Query)], debug=True) services.listen(49009) tornado.ioloop.IOLoop.instance().start() 

Leider ist das ToServerQueue.get() nicht tatsächlich blockiert, bis die Warteschlange ein Element hat, sondern vielmehr einen tornado.concurrent.Future zurückgibt. Welches ist kein gesetzlicher Wert, um an den self.write() Anruf zu gelangen.

Ich glaube, meine allgemeine Frage ist zweifach:

1) Wie kann ein HTTP Verb Aufruf (zB get, put, post, etc) blockieren und dann von einem anderen HTTP Verb Aufruf signalisiert werden.

2) Wie kann ich Daten von einem Aufruf zum anderen freigeben?

Ich habe nur die einfachen / unkomplizierten Anwendungsfälle von kleinen REST-Servern mit Tornado wirklich zerkratzt. Ich frage mich, ob das Coroutine Zeug ist was ich brauche, aber habe nicht ein gutes Tutorial / Beispiel dafür gefunden, um mir zu helfen, das Licht zu sehen, wenn das tatsächlich der Weg ist zu gehen.

One Solution collect form web for “Tornado ein Handler Blöcke für einen anderen”

1) Wie kann ein HTTP Verb Aufruf (zB bekommen, put, post, u ne etc) Block und dann von einem anderen HTTP Verb Aufruf signalisiert werden.

2) Wie kann ich Daten von einem Aufruf zum anderen freigeben?

Für jede Anfrage wird das neue RequestHandler Objekt angelegt. Also brauchst du einen Koordinator, zB queues oder locks mit Staatsobjekt (in deinem Fall wäre es eine Neuimplementierung der Warteschlange).

tornado.queues sind Schlangen für coroutines. Queue.get , Queue.put , Queue.join return Zukünftige Objekte, die "gelöst" werden müssen – geplante Task, die entweder mit Erfolg oder Ausnahme durchgeführt wird. Um zu warten, bis die Zukunft behoben ist, solltest du es yielded (genau wie in den doc-Beispielen von tornado.queues ). Die Verben-Methode muss auch mit tornado.gen.coroutine verziert werden.

 import tornado.gen class Query(tornado.web.RequestHandler): @tornado.gen.coroutine def get(self): toServer = yield ToServerQueue.get() self.write(toServer) @tornado.gen.coroutine def post(self): toServer = self.request.body yield ToServerQueue.put(toServer) toClient = yield ToClientQueue.get() self.write(toClient) @tornado.gen.coroutine def put(self): yield ToClientQueue.put(self.request.body) self.write(bytes()) 

Die GET Anforderung Queue.get (auf nicht blockierende Weise warten), bis etwas in der Warteschlange verfügbar ist (oder Timeout, das als Queue.get arg definiert werden Queue.get ).

tornado.queues.Queue bietet auch get_nowait (es gibt auch get_nowait ), die nicht nachgegeben werden müssen – gibt sofort Item aus der Warteschlange zurück oder werft Ausnahme.

  • Wie man Flask App mit Tornado ausführt
  • Python Tornado macht statisches Verzeichnis
  • Gibt es einen besseren Weg, um index.html mit Tornado zu behandeln?
  • Python websocket mit tornado Steckdose nicht geschlossen
  • Mit Tornado, wie kann ich statische Dateien und servieren ein favicon.ico aus einem anderen Verzeichnis als der statische Pfad?
  • So erhalten Sie Bildgröße (Bytes) mit PIL
  • Was ist das neue Tornado-Framework von Facebook?
  • Was ist ein guter Weg, um Ihre Modelle zu organisieren, Verbindungen, wenn man SQLAlchemy verwenden möchte, um mehrere Datenbanken mit verschiedenen Anwendungen zu verbinden?
  • Wie benutzt man einen Test-Tornado-Server-Handler, der einen Benutzer über ein sicheres Cookie authentifiziert
  • Holen Sie sich Python Tornado Version?
  • Tornado und Unicode
  • Python ist die beste Programmiersprache der Welt.