How does long-polling work in Tornado?

后端 未结 3 1426
野趣味
野趣味 2020-12-11 07:37

In Tornado\'s chat demo, it has a method like this:

@tornado.web.asynchronous
def post(self):
    cursor = self.get_argument("cursor", None)
    gl         


        
3条回答
  •  离开以前
    2020-12-11 08:08

    The right way to convert your test app into a form that won't block the IOLoop is like this:

    from tornado.ioloop import IOLoop
    import tornado.web
    from tornado import gen
    import time
    
    @gen.coroutine
    def async_sleep(timeout):
        """ Sleep without blocking the IOLoop. """
        yield gen.Task(IOLoop.instance().add_timeout, time.time() + timeout)
    
    class MainHandler(tornado.web.RequestHandler):
        @gen.coroutine
        def get(self):
            print("Start request")
            yield async_sleep(4)
            print("Okay done now")
            self.write("Howdy howdy howdy")
            self.finish()
    
    if __name__ == "__main__":
        application =  tornado.web.Application([
            (r'/', MainHandler),
        ])
        application.listen(8888)
        IOLoop.instance().start()
    

    The difference is replacing the call to time.sleep with one which won't block the IOLoop. Tornado is designed to handle lots of concurrent I/O without needing multiple threads/subprocesses, but it will still block if you use synchronous APIs. In order for your long-polling solution to handle concurrency the way you'd like, you have to make sure that no long-running calls block.

提交回复
热议问题