Wie kann ich Tornado und Redis asynchron?

Ich versuche zu finden, wie kann ich Redis und Tornado asynchron. Ich fand die tornado-redis, aber ich brauche mehr als nur ein yield im code.

Ich habe den folgenden code:

import redis
import tornado.web

class WaiterHandler(tornado.web.RequestHandler):

    @tornado.web.asynchronous
    def get(self):
        client = redis.StrictRedis(port=6279)
        pubsub = client.pubsub()
        pubsub.subscribe('test_channel')

        for item in pubsub.listen():
            if item['type'] == 'message':
                print item['channel']
                print item['data']

        self.write(item['data'])
        self.finish()


class GetHandler(tornado.web.RequestHandler):

    def get(self):
        self.write("Hello world")


application = tornado.web.Application([
    (r"/", GetHandler),
    (r"/wait", WaiterHandler),
])

if __name__ == '__main__':
    application.listen(8888)
    print 'running'
    tornado.ioloop.IOLoop.instance().start()

Muss ich immer Zugriff auf die / url und Holen Sie sich die "Hallo Welt", solange es eine Anforderung noch in der /wait.
Wie kann ich es tun?

  • Redis pub/sub sollte nicht verwendet werden web.RequestHandler, weil es blockiert die ioloop während der Wartezeit auf pubsub.listen(). Haben Sie einen Blick auf tornadogists.org/532067 für eine funktionierende websocket-Beispiel.
  • Das websocket ist eine gute option, aber meine Anwendung benötigt werden, arbeiten in Browsern, die nicht über Unterstützung für websockets. Ich bin mit long polling. Das ist der Grund, ich brauche ein 'async Holen.
  • in diesem Fall Ihre beste Wette ist die Aufrechterhaltung eines lokalen Zustand des abonnierten Kanal Geschichte (zugeführt durch einen separaten thread), und dann schreiben, dass der Staat sofort auf die Antwort und füllen Sie die get Betrieb. Der client sollte halten einige Rekorde der letzten index -, oder in letzter Zeit bekommen, etc., so dass Sie, um die Kontinuität für verschiedene Kunden. Ich werde schreiben, bis eine Antwort mit einem Beispiel, in ein paar Stunden wenn ich Zeit dazu.
Schreibe einen Kommentar