Вопрос об асинхронности и ожидании в коде python

#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, вам нужно сделать ее доступной для ожидания, например, с помощью сопрограммы.

документы asyncio