Sobes.tech
Назад к вопросам
Middle+
4

Может ли возникнуть race condition в асинхронном коде Python?

Компании, где спрашивали
ИннотехИннотех

Ответ от нейросети

sobes.tech AI

Да, race condition может возникнуть и в асинхронном коде Python, особенно если несколько корутин или задач одновременно обращаются и изменяют общие данные без должной синхронизации.

Хотя Python использует GIL (Global Interpreter Lock), который предотвращает одновременное выполнение байткода в нескольких потоках, в асинхронном коде несколько задач могут переключаться в произвольных местах, что приводит к состояниям гонки при доступе к общим ресурсам.

Пример:

import asyncio

shared_counter = 0

async def increment():
    global shared_counter
    temp = shared_counter
    await asyncio.sleep(0)  # переключение контекста
    shared_counter = temp + 1

async def main():
    tasks = [increment() for _ in range(1000)]
    await asyncio.gather(*tasks)
    print(shared_counter)

asyncio.run(main())

В этом примере из-за переключения контекста между чтением и записью shared_counter итоговое значение может быть меньше 1000, что свидетельствует о race condition.

Для предотвращения таких проблем используют механизмы синхронизации, например, asyncio.Lock.