2016-01-27 6 views
1

Так что я имел блок кода, который выглядел, как это в моем приложении Торнадо:Python 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 способ сделать это в еще асинхронным способом? (Я понимаю, что я мог бы проверить все возможные комбинации три BOOLS и выход объекта как первый кодовый блок, но я бы предпочел, чтобы избежать этого.)

(я на Python 2.7)

ответ

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, или «разрешенное» будущее.

Устранение словаря приостанавливает вашу сопрограмму до тех пор, пока все операции не будут завершены. В случае «разрешен» он уже завершен, и его значение равно None, в случае make_network_call_one и т. Д. Операции могут занять некоторое время. «результаты» теперь являются dict с тем же набором ключей, что и «задачи», но все фьючерсы в «задачах» заменяются значениями.

+0

Спасибо - можете ли вы объяснить, что это делает? У меня есть смутная идея, но я точно не знаю, что делает каждый звонок. Создает ли 'results = yield tasks' новый ключ с тремя ключами: itemOne',' itemTwo' и 'itemThree'? –

+0

Хм, я также должен упомянуть, что я на Python 2.7. Я считаю, что Futures были представлены в Python 3.2? –

+0

«Разрешено» вообще? Могу ли я просто сделать сделать: 'если should_make_call_one: задачи [ 'itemOne'] = make_network_call_one() ... результаты = выход tasks' –

Смежные вопросы