Гонки возможны между участками, разделёнными await: другая задача успевает изменить общее состояние до продолжения первой. Один поток исключает одновременное исполнение, но не логическое чередование операций.
Зачем нужны Lock, Event и другие примитивы синхронизации в asyncio, если event loop обычно работает в одном потоке? Возможны ли гонки данных?
Гонки возможны между участками, разделёнными await: другая задача успевает изменить общее состояние до продолжения первой. Один поток исключает одновременное исполнение, но не логическое чередование операций.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Гонки возможны между участками, разделёнными await: другая задача успевает изменить общее состояние до продолжения первой. Один поток исключает одновременное исполнение, но не логическое чередование операций.
Например, две задачи читают один остаток, обе ждут сеть, затем обе записывают результат на основе старого значения. Lock делает соответствующий составной участок взаимоисключающим; Event уведомляет о событии, Semaphore ограничивает параллельные операции. Не держите блокировку без необходимости во время долгого внешнего вызова и учитывайте отмену. Эти примитивы защищают задачи конкретного процесса, а не общую БД между несколькими workers.