Tornado async http客户端块

时间:2016-03-07 08:18:43

标签: python python-2.7 tornado

theQueue = tornado.queues.Queue()
theQueue.put_nowait('http://www.baidu.com')
theQueue.put_nowait('http://www.google.com')
theQueue.put_nowait('http://cn.bing.com/')

@tornado.gen.coroutine
def Test1():
    def cb(response):
        print str(response)

    while True:
        item = yield theQueue.get()
        print item
        tmp = tornado.httpclient.AsyncHTTPClient(force_instance=True)
        tmp.fetch(item,callback=cb)

@tornado.gen.coroutine
def Test2():
    while True:
        item = yield theQueue.get()
        print item
        tmp = tornado.httpclient.AsyncHTTPClient(force_instance=True)
        response = yield tmp.fetch(item)
        print str(response)

#Test1()
Test2()
tornado.ioloop.IOLoop.instance().start()

python 2.6和龙卷风4.2
在函数Test1中,它将首先打印3个项目,然后打印3个响应 但是在Test2中,它将逐个打印项目及其响应。

我很困惑,为什么Test2不是异步的?

1 个答案:

答案 0 :(得分:1)

Test2()是异步的,但以不同的方式,以协程方式。

Tornado的协程在遇到yield关键字时暂停,等待异步进程(在您的情况下,通过http客户端请求网页)完成。 龙卷风将在当前协程暂停时切换到其他可用的协同程序。

使用协同程序,您的代码看起来是同步的,并且“同步运行”(如果只有一个协程)。

您可以使用两个或多个conroutines轻松测试龙卷风协程的ASYNC功能:

@tornado.gen.coroutine
def Test2():
    while True:
        item = yield theQueue.get()
        print 'Test2:', item
        tmp = tornado.httpclient.AsyncHTTPClient(force_instance=True)
        response = yield tmp.fetch(item)
        print 'Test2:', str(response)

# Write another test function called `Test3` and do the exactly same thing with Test2.
@tornado.gen.coroutine
def Test3():
    while True:
        item = yield theQueue.get()
        print 'Test3:', item
        tmp = tornado.httpclient.AsyncHTTPClient(force_instance=True)
        response = yield tmp.fetch(item)
        print 'Test3:', str(response)

Test2()
Test3()
tornado.ioloop.IOLoop.instance().start()

在此示例中,您将看到Test2和Test3同时运行(但不是真的)

在不同的例程之间切换以执行并发操作的能力,这就是协同异步的意义。