Вопрос проверяет понимание разных моделей конкурентности и умение выбирать подходящий инструмент под задачу.
async/await — это кооперативная модель конкурентности, а потоки — вытесняющая. В async коде переключение задач происходит в заранее определённых местах ожидания. Потоки же могут быть прерваны планировщиком в любой момент. async/await обычно проще контролировать и масштабировать для I/O-задач.
Хотя и async/await, и потоки используются для конкурентного выполнения, они решают задачу разными способами.
Async/await — это модель конкурентности, основанная на событийном цикле.
Характерные свойства:
один поток исполнения
переключение задач происходит только в await
отсутствие гонок данных по умолчанию
минимальные накладные расходы
Пример идеи:
async def fetch():
data = await get_data() # точка переключения
Потоки:
управляются планировщиком ОС
могут переключаться в любой момент
требуют синхронизации при доступе к данным
подвержены race condition
Пример:
# несколько потоков могут выполняться вперемешку
async/await — большое количество I/O-запросов
потоки — блокирующие библиотеки без async-интерфейса
вычисления — процессы
async/await даёт управляемую и предсказуемую конкурентность для I/O-задач, тогда как потоки подходят для интеграции с блокирующим кодом, но сложнее в контроле.