Выбор ответа Senior asyncio обновлено

Гонка в однопоточном asyncio

Вопрос

Может ли быть гонка данных в asyncio, если всё выполняется в одном потоке?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Да: другая задача может вклиниться на await. Код между двумя await выполняется без переключений, но операция «прочитать баланс, await запрос, записать баланс» разрывается точкой await, и другая задача успеет прочитать старое значение.

Варианты ответа

  1. Нет: в одном потоке гонки данных невозможны
  2. Только если используется to_thread или пул потоков
  3. Только в free-threaded сборке без GIL
  4. Да: другая задача может вклиниться на awaitправильный ответ

Разбор

Код между двумя await выполняется без переключений, но операция «прочитать баланс, await запрос, записать баланс» разрывается точкой await, и другая задача успеет прочитать старое значение. Это логическая гонка, она не требует потоков. Защищают через asyncio.Lock или перенос атомарности в БД (транзакции, UPDATE ... SET x = x - 1).

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.