Sobes.tech
Назад к вопросам
Junior — Middle
85

Можешь привести пример ситуации с гонкой условий в асинхронной библиотеке asyncio?

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

sobes.tech AI

Гонка условий (race condition) в asyncio возникает, когда несколько корутин одновременно пытаются изменить общий ресурс без должной синхронизации.

Пример:

import asyncio

counter = 0

async def increment():
    global counter
    temp = counter
    await asyncio.sleep(0.1)  # имитируем задержку
    counter = temp + 1

async def main():
    await asyncio.gather(increment(), increment())
    print(f'Counter: {counter}')

asyncio.run(main())

Ожидаемый результат: Counter: 2, но из-за гонки условий может получиться Counter: 1, так как обе корутины прочитали одно и то же значение counter до обновления.

Чтобы избежать гонок, используют синхронизацию, например, asyncio.Lock:

lock = asyncio.Lock()

async def safe_increment():
    global counter
    async with lock:
        temp = counter
        await asyncio.sleep(0.1)
        counter = temp + 1

async def main():
    await asyncio.gather(safe_increment(), safe_increment())
    print(f'Counter: {counter}')

asyncio.run(main())

Теперь counter корректно увеличится до 2, так как доступ к ресурсу защищён.