Search code examples
pythontornado

Python tornado AsyncHttpClient does not send any request


Below is a snippet from the tornado documentation.

def handle_response(response):
if response.error:
    print("Error: %s" % response.error)
else:
    print(response.body)

http_client = AsyncHTTPClient()
http_client.fetch("http://www.google.com/", handle_response)

But this does not print anything to the console. I tried adding a time.sleep at the end but even then nothing prints.

Also, it does not send any request to my server when I change the url above to point to my server. tornado.httpclient.HTTPClient works fine though.

I am on Macbook with Python 3.6.1.


Solution

  • Tornado is an asynchronous framework where all tasks are scheduled by a single event loop called the IOLoop. At the end of your program, put:

    import tornado.ioloop
    tornado.ioloop.IOLoop.current().start()
    

    That will start the loop running and allow the AsyncHTTPClient to fetch the URL.

    The IOLoop runs forever, so you need to implement some logic that determines when to call IOLoop.stop(). In your example program, call IOLoop.stop() at the bottom of handle_response. In a real HTTP client program, the loop should run until all work is complete and the program is ready to exit.