Back to questions
Иннотех
Middle+
5
Может ли возникнуть race condition в асинхронном коде Python?
Companies where asked
Answer from AI
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.