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