Выбор ответа Senior asyncio обновлено
Гонка в однопоточном asyncio
Вопрос
Может ли быть гонка данных в asyncio, если всё выполняется в одном потоке?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Да: другая задача может вклиниться на await. Код между двумя await выполняется без переключений, но операция «прочитать баланс, await запрос, записать баланс» разрывается точкой await, и другая задача успеет прочитать старое значение.
Варианты ответа
- Нет: в одном потоке гонки данных невозможны
- Только если используется
to_threadили пул потоков - Только в free-threaded сборке без GIL
- Да: другая задача может вклиниться на
awaitправильный ответ
Разбор
Код между двумя await выполняется без переключений, но операция «прочитать баланс, await запрос, записать баланс» разрывается точкой await, и другая задача успеет прочитать старое значение. Это логическая гонка, она не требует потоков. Защищают через asyncio.Lock или перенос атомарности в БД (транзакции, UPDATE ... SET x = x - 1).
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.