Если в асинхронной функции Python использовать блокирующую задержку time.sleep(), то выполнение всей программы будет приостановлено на время сна, блокируя текущий поток. Это нарушает преимущества асинхронности, так как другие задачи в event loop не смогут выполняться параллельно.
Что произойдет, если в асинхронном коде вызвать синхронную блокирующую функцию, например time.sleep() или тяжелый запрос через библиотеку requests? Как правильно выносить такие вызовы за пределы event loop?
Если в асинхронной функции Python использовать блокирующую задержку time.sleep(), то выполнение всей программы будет приостановлено на время сна, блокируя текущий поток.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Что произойдет, если в асинхронном коде вызвать синхронную блокирующую функцию, например time.sleep() или тяжелый запрос через библиотеку requests? Как правильно выносить такие вызовы за пределы event loop?
Ответ
Если в асинхронной функции Python использовать блокирующую задержку time.sleep(), то выполнение всей программы будет приостановлено на время сна, блокируя текущий поток. Это нарушает преимущества асинхронности, так как другие задачи в event loop не смогут выполняться параллельно.
Вместо time.sleep() в асинхронном коде следует использовать await asyncio.sleep(), который не блокирует event loop и позволяет другим корутинам выполняться во время ожидания.
Пример:
import asyncio
import time
async def wrong_sleep():
print('Start')
time.sleep(2) # блокирует весь event loop
print('End')
async def correct_sleep():
print('Start')
await asyncio.sleep(2) # не блокирует event loop
print('End')
asyncio.run(correct_sleep())