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不是异步的?
答案 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同时运行(但不是真的)。
在不同的例程之间切换以执行并发操作的能力,这就是协同异步的意义。