Junior — Middle
69
Могут ли возникнуть ситуации гонки данных при одновременной работе нескольких корутин внутри одного потока?
Answer from AI
sobes.tech AI
В Python корутины внутри одного потока обычно выполняются последовательно, переключаясь в моменты ожидания (await). Это означает, что одновременно код корутин не выполняется, и классические гонки данных, как при многопоточности, возникают редко.
Однако гонки данных могут появиться, если корутины совместно используют изменяемые объекты без должной синхронизации. Например, если одна корутина изменяет список, а другая читает или тоже изменяет его без await между операциями, возможны непредсказуемые состояния.
Для предотвращения таких ситуаций применяют:
- Использование asyncio.Lock для защиты критических секций.
- Избегание совместного изменяемого состояния или использование иммутабельных структур.
Пример с asyncio.Lock:
import asyncio
lock = asyncio.Lock()
shared_resource = 0
async def coro():
global shared_resource
async with lock:
temp = shared_resource
await asyncio.sleep(0) # переключение
shared_resource = temp + 1
async def main():
await asyncio.gather(coro(), coro())
asyncio.run(main())
print(shared_resource) # гарантированно 2