Назад к вопросам
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, так как доступ к ресурсу защищён.