Tornado Coroutine:返回值和一次执行

时间:2016-09-24 19:19:08

标签: python tornado

我是Tornado的新手,所以我想知道下面的代码是否是解决问题的正确方法,或者是更好的方法。它有效,但我不确定它的效率。

代码基于文档here

在我的脚本中间,我需要运行HTTP请求(10-50)。显然,可以通过这种方式并行执行此操作:

@gen.coroutine
def parallel_fetch_many(urls):
    responses = yield [http_client.fetch(url) for url in urls]
    # responses is a list of HTTPResponses in the same order

协程完成后如何访问响应?我可以添加return responses吗? 另外,因为我只需要在代码中使用一次异步进程,所以我就这样启动IOLoop:

# run_sync() doesn't take arguments, so we must wrap the
# call in a lambda.
IOLoop.current().run_sync(lambda: parallel_fetch_many(googleLinks))

这样做是否正确?或者我应该在脚本开头启动IOLoop并将其停止结束,即使我只使用一次异步过程。

基本上,我的问题是:下面的代码是否正确?

@gen.coroutine
def parallel_fetch_many(urls):
    responses = yield [http_client.fetch(url) for url in urls]
    return responses

googleLinks = [url1,url2,...,urln]

responses = IOLoop.current().run_sync(lambda:parallel_fetch_many(googleLinks))

do_something(responses)

1 个答案:

答案 0 :(得分:1)

是的,您的代码对我来说是正确的。