[英]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.