繁体   English   中英

Python龙卷风-进行异步通话?

[英]Python Tornado — Make calls async?

所以我在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()

以仍然异步的方式执行此操作的最佳/最新方式是什么? (我意识到我可以检查这三个布尔值的所有可能组合,并产生一个类似于第一个代码块的对象,但我希望避免这种情况。)

(我使用的是Python 2.7)

这个怎么样?:

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返回的期货,或“已解决”的期货。

屈服字典会暂停协程,直到完成所有操作。 在“已解决”的情况下,它已经完成,其值为“无”,在make_network_call_one等情况下,该操作可能需要一些时间。 现在,“结果”是一个与“任务”具有相同键集的字典,但是“任务”中的所有期货都被值替换。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM