【问题标题】:Tornado long polling requestsTornado 长轮询请求
【发布时间】:2013-06-12 17:04:47
【问题描述】:

下面是我的问题最简单的例子:

发出请求时,它将打印Request via GET <__main__.MainHandler object at 0x104041e10>,然后请求将保持打开状态。好的!但是,当您发出另一个请求时,它不会调用 MainHandler.get 方法,直到第一个连接完成。

如何让多个请求进入get 方法,同时让它们保持长轮询。我正在为每个请求传递参数,这些参数将通过 redis 从发布/订阅中获得不同的结果。问题是我一次只能连接一个。怎么了?为什么这会阻止其他请求?

import tornado.ioloop
import tornado.web
import os


class MainHandler(tornado.web.RequestHandler):
    @tornado.web.asynchronous
    def get(self):
        print 'Request via GET', self


if __name__ == '__main__':
    application = tornado.web.Application([
        (r"/", MainHandler)])

    try:
        application.listen(int(os.environ.get('PORT', 5000)))
        tornado.ioloop.IOLoop.instance().start()
    except KeyboardInterrupt:
        tornado.ioloop.IOLoop.instance().stop()

左图:如上述问题所述。请求未按右图中请求的方式处理。 右图 我需要 RequestHandler 处理请求(a-d),然后等待 pub/sub 公布他们的数据。

A B C D + + + + ++ a b c d | | | | || + + + + | | | | || | | | | | | | | || | | | | | | | | || | | | | | v v v || | | | | +---|------------------+ || +-----|----|---|---|------------------+ | | | || | | | | | | | + 请求处理程序| || | + + + + 请求汉。 | | | | || | | | | | | +---|------------------+ || +-----|----|---|---|------------------+ +---|------------------+ || +-----|----|---|---|------------------+ | | | || | | | | | | | + Sub/Pub Qu | || | v + v v 阙 | | | | || | | | +---|------------------+ || +---------|--------------+ +---|------------------+ || +---------|--------------+ | || | |完成|| |完成的 v || v || || || || || || || ++

如果这可以用另一种编程语言完成,请告诉我。

感谢您的帮助!

【问题讨论】:

    标签: python tornado long-polling


    【解决方案1】:

    来自http://www.tornadoweb.org/en/stable/web.html#tornado.web.asynchronous

    tornado.web.asynchronous(方法)

    ...

    如果给定了这个装饰器,当 方法返回。由请求处理程序调用 self.finish() 完成 HTTP 请求。没有这个装饰器,请求是 get() 或 post() 方法返回时自动完成。

    你必须明确地完成get方法:

    import tornado.ioloop
    import tornado.web
    import tornado.options
    
    from tornado.options import define, options
    define("port", default=8000, help="run on the given port", type=int)
    
    class MainHandler(tornado.web.RequestHandler):
        @tornado.web.asynchronous
        def get(self):
            print 'Request via GET', self
            self.finish()
    
    
    if __name__ == '__main__':
        application = tornado.web.Application([
            (r"/", MainHandler)])
    
        try:
            application.listen(options.port)
            tornado.ioloop.IOLoop.instance().start()
        except KeyboardInterrupt:
            tornado.ioloop.IOLoop.instance().stop()
    

    【讨论】:

    • 感谢您的回复。但是,我正在寻找一种方法来执行长轮询请求。不仅要关闭连接,还要让它保持活动状态,直到我有数据为止。并且数据将从 redis sub/pub 提供,并且对于每个连接的客户端都是不同的。
    • @StevePeak 你有没有找到任何解决方案,因为我正在尝试在龙卷风中做同样的事情。我需要在 tornado 中创建一个长轮询端点,并在我从 redis 获取某些内容时返回数据。一般来说,我对龙卷风和异步编程很陌生。
    猜你喜欢
    • 1970-01-01
    • 2021-10-13
    • 2014-12-13
    • 2012-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-10
    • 1970-01-01
    相关资源
    最近更新 更多