1

以下是我的问题的最简单示例:

发出请求后,它将打印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 B C D
       + + + + ++ abcd
       | | | | || + + + +
       | | | | || | | | |
       | | | | || | | | |
       | | | | || | | | |
       | vvv || | | | |
   +---|------------------+ || +-----|----|---|---|------------------+
   | | | || | | | | | |
   | + 请求处理程序| || | + + + + 请求汉。|
   | | | || | | | | | |
   +---|------------------+ || +-----|----|---|---|------------------+
   +---|------------------+ || +-----|----|---|---|------------------+
   | | | || | | | | | |
   | + Sub/Pub Qu | || | v + vv 阙 |
   | | | || | | |
   +---|------------------+ || +---------|--------------+
   +---|------------------+ || +---------|--------------+
       | || |
       | 完成|| | 完成的
       v || v
                                           ||
                                           ||
                                           ||
                                           ||
                                           ||
                                           ||
                                           ||
                                           ++

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

谢谢您的帮助!

4

1 回答 1

2

来自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()
于 2013-06-16T19:34:41.493 回答