2017-01-06 4 views
0

В торнадо 4.3 + python3, если у меня есть много слоев функции асинхронной, например:Торнадо: Распаковка много слоев будущего

@gen.coroutine 
def layer_2(): 
    return(yield async_func()) 

@gen.coroutine 
def layer_1(): 
    return(yield layer_2()) 

@gen.coroutine 
def main(): 
    return(yield layer_1()) 

Поскольку функция асинхронная возвращает будущее (получая это будущий возвращает его результат), чтобы получить возвращаемое значение async_func в main, я должен:

  • в каждом вызываемым, завернуть в будущее, выданное ответным заявлением

  • В каждого абонента, чтобы передать значение вверх вызывающую цепочку, выход вызываемого абонента и деформировать возвращаемое значение в ответном заявлении вновь

Есть в любом случае, чтобы избежать этого шаблона?

ответ

2

Это правильный способ вызова сопрограммы из сопрограмм в Торнадо. Не существует «способа избежать этого шаблона», действительно, это то, как сопрограммы работают по дизайну!

Для получения дополнительной информации см. Tornado coroutines guide или мой Refactoring Tornado Coroutines.

+0

Да, я понимаю это, но не такой подход уродливый (дублирующий код)? Один из подходов, о котором я могу думать, заключается в том, чтобы удержаться в 'main()', пока возвращаемый результат больше не является будущим. –

+0

Вот как справки предназначены для работы. Больше нет «дублирования», чем тот факт, что нормальным функциям Python все еще нужно ключевое слово «return». –

+0

Спасибо! Просто хотел дважды проверить разумный улей, если я пропустил что-нибудь. Я правильно ответил на ваш ответ! –

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