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.

  • Python Tornado Websocket Verbindungen noch offen, nachdem sie geschlossen wurden
  • Kann nicht Ergebnis () auf Futures in Tornado aufrufen
  • Standard-Weg, um User-Session im Tornado zu behandeln
  • Tornado [Errno 24] Zu viele offene Dateien [duplizieren]
  • Leistung von: asynchroner Anforderungshandler mit Sperraufgaben, die vom Arbeiterpool behandelt werden
  • Kann ich Tornado + Celery + RabbitMQ + Redis verwenden?
  • Tornado benutzerdefinierte Fehlerbehandlung für Statische Datei
  • Tornado senden Nachricht auf Veranstaltung
  • Wie kann ich Tornado und Redis asynchron verwenden?
  • Python Socket.IO-Client für das Senden von Broadcast-Nachrichten an TornadIO2 Server
  • Warteschlange und ProcessPoolExecutor in Tornado
  • Python ist die beste Programmiersprache der Welt.