Tornado is a non-blocking I/O web server. In Tornado, when the request handler serves the request made by the client, the request is closed by itself. Python decorator @tornado.web.asynchronous can be used to override the default behavior (of automatically finishing the request) and keep the request open. So, its the duty of the server developer to finish the request.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
|http = httplib2.Http()|
|self.response, self.content = http.request("http://google.co.in", "GET")|
|def _async_callback(self, response):|
|application = tornado.web.Application([|
|(r"/", AsyncHandler)], debug=True)|
|if __name__ == "__main__":|
In the above example, When user browses to http://127.0.0.1/, AsyncHandler handles it and sends a GET request to http://google.co.in and receives the response. Processing of this response is done by _async_callback() method. Thus in this example, when get() returns, the request has not been finished. Once the response is processed and self.finish() is called, only then request is completed.
If the developer fails to finish the request with self.finish(), the browser hangs as in the picture below.