python3 asyncio: все функции в стеке должны использовать await / async - PullRequest
3 голосов
/ 10 мая 2019

При использовании await/async должен ли он идти "до конца", то есть должен ли он использоваться каждой функцией в цепочке вызовов?

например:.

def a():
    # can't call b() here

async def b():
    return await c

async def c():
    return ...

Недавно я задался вопросом об этом в контексте приложения фляги, работающего под Gevent, где одной из конечных точек был длительный вызов, который должен быть "проверен", при этом не блокируя другие вызовы

def handler0():
    # short running
    return ...

def handler():  # blocks handler0
    return await some_long_thing()

async def some_long_thinig():
    # ..do somethiing
    return ...

1 Ответ

0 голосов
/ 10 мая 2019

должна ли каждая функция в цепочке вызовов использовать ее?

При использовании модуля asyncio каждая функция, для которой await для чего-то должна быть определена как async (должен быть сопрограммой сам).

Большинство сопрограмм верхнего уровня обычно являются основной точкой входа вашего скрипта и выполняются циклом событий с использованием asyncio.run () или аналогичной функции.

Вот как asyncio разработал : таким образом, вы всегда знаете, может ли контекст быть переключен или не может быть переключен в определенном месте.

...