Python Tornado - 调用异步?

时间:2016-01-27 02:17:15

标签: python asynchronous tornado

所以我的Tornado应用程序中有一个看起来像这样的代码块:

fetch_results = yield {
    'itemOne': make_network_call_one(),
    'itemTwo': make_network_call_two(),
    'itemThree': make_network_call_three()
}

这三个网络呼叫显然是异步的。

现在,我有bool告诉我是否需要实际进行这些网络呼叫。

例如:

if should_fetch_item_one:
    item_one = yield make_network_call_one()
if should_fetch_item_two:
    item_two = yield make_network_call_two()
if should_fetch_item_three:
    item_three = yield make_network_call_three()

以静止异步方式执行此操作的最佳/最Pythonic方法是什么? (我意识到我可以检查三个bool的所有可能组合并产生一个像第一个代码块的对象,但我更愿意避免这种情况。)

(我在Python 2.7上)

1 个答案:

答案 0 :(得分:0)

这个怎么样?:

from tornado.concurrent import Future
from tornado import gen

@gen.coroutine
def f():
    resolved = Future()
    resolved.set_result(None)

    tasks = {}
    tasks['itemOne'] = make_network_call_one() if should_make_call_one else resolved
    tasks['itemTwo'] = make_network_call_two() if should_make_call_two else resolved
    tasks['itemThree'] = make_network_call_three() if should_make_call_three else resolved
    results = yield tasks

"已解决的问题"是为了确保你的任务"字典总是有三个相同的键:" itemOne"," itemTwo"和" itemThree"。 "任务"中的所有值是期货:由make_network_call_one之类的协同程序返回的期货,或者#34;已解决的"将来

让字典暂停你的协程,直到所有操作完成。在"已解决"它已经完成,其值为None,在make_network_call_one等情况下,操作可能需要一些时间。 "结果"现在是一个dict,它具有与"任务"相同的一组键,但是"任务中的所有期货"被值替换。