经过一些痛苦的尝试后,我写了这样的话:
urls=[
'http://localhost',
'http://www.baidu.com',
'http://www.taobao.com',
'http://www.163.com',
'http://www.sina.com',
'http://www.qq.com',
'http://www.jd.com',
'http://www.amazon.cn',
]
@tornado.gen.coroutine
def fetch_with_coroutine(url):
response=yield tornado.httpclient.AsyncHTTPClient().fetch(url)
print url,len(response.body)
raise tornado.gen.Return(response.body)
@tornado.gen.coroutine
def main():
for url in urls:
yield fetch_with_coroutine(url)
timestart=time.time()
tornado.ioloop.IOLoop.current().run_sync(main)
print 'async:',time.time()-timestart
但它甚至比同步代码慢一点。另外输出的顺序总是一样的,所以我认为它不是异步运行的。 我的代码出了什么问题?
答案 0 :(得分:2)
在main()
中,您一次只能呼叫fetch_with_coroutine
一个;您使用yield
的方式意味着第二次获取无法启动,直到第一次完成为止。相反,您需要首先启动它们并以单一产量等待它们:
@gen.coroutine
def main():
# 'fetches' is a list of Future objects.
fetches = [fetch_with_coroutine(url) for url in urls]
# 'responses' is a list of those Futures' results
# (i.e. HTTPResponse objects).
responses = yield fetches