龙卷风协程的问题。不会异步运行

时间:2015-08-18 03:20:08

标签: python asynchronous tornado yield coroutine

经过一些痛苦的尝试后,我写了这样的话:

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

但它甚至比同步代码慢一点。另外输出的顺序总是一样的,所以我认为它不是异步运行的。 我的代码出了什么问题?

1 个答案:

答案 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