#python #asynchronous #async-await
#python #асинхронный #асинхронный-ожидание
Вопрос:
Я не уверен, как использовать aync / await. Предположим, у меня есть эта функция:
async def test():
result = get_db_data() # to get records from db
return result
Итак, здесь get_data не является асинхронной функцией, и когда я вызываю test(), я использую await test() . Но мой вопрос в том, что код считается асинхронным, или я должен также создать get_data и async func и вызвать его с помощью await ?
Пожалуйста, мне нужна помощь
Примечание: я попытался добавить await asyncio.sleep(30) в тестовую функцию и одновременно протестировал 2 запроса, поэтому кажется, что он работает, потому что он вернул оба результата через 30 секунд (так что это не заняло 60 секунд)
Ответ №1:
Backgorund
Вот небольшой пример, который, я надеюсь, поможет вам понять. Скажем, вот ваша функция
async def test():
# does something
Теперь, почему мы сделали его асинхронным? Скажем, нам пришлось использовать его в другом потоковом методе.
async def threaded_f():
result = await test()
# Some random code to get variable Y
Y = Y result
Теперь преимущество создания test() асинхронным заключается в том, что в строке result = test() поток будет ждать результата test(), потому что его возвращаемое значение будет использоваться позже в коде. Если бы это была функция типа void, мы могли бы не ожидать вызова и позволить потоковой функции продолжить ее выполнение.
Ответ
Итак, чтобы ответить на ваш вопрос. Да, вы можете сделать get_db_data() асинхронным и ожидать, поскольку это тот же случай, который обсуждался в функции threaded_f . Результаты необходимо сохранить в переменной.
Ответ №2:
В ответ на ваш вопрос get_db_data не будет рассматриваться как асинхронный только потому, что он находится внутри сопрограммы асинхронного тестирования.
Вам нужно понимать цикл событий и сопрограммы, чтобы хорошо ответить на ваш вопрос.
Если ваша синхронная процедура не блокируется, вам это может сойти с рук, но вам нужно тщательно понимать, что она делает, чтобы убедиться, что это не вызывает неожиданных задержек. Если вы не хотите, чтобы ваша программа блокировалась get_db_data, вам нужно сделать ее доступной для ожидания, например, с помощью сопрограммы.