Встречается на собеседованиях • сегодня

Возможна ли гонка между корутинами в одном потоке

Да, гонка (race condition) возможна между корутинами даже в одном потоке. Хотя корутины выполняются в одном потоке и не прерываются насильственно (как потоки), порядок их выполнения недетерминирован, если есть await точки.

Пример:

python
import asyncio

counter = 0

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

async def main():
global counter
tasks = [increment() for _ in range(1000)]
await asyncio.gather(*tasks)
print(counter) # может быть меньше 1000

asyncio.run(main())

text

**Почему:**  
- Между `temp = counter` и `counter = temp + 1` корутина может быть приостановлена, и другая корутина прочитает то же значение `temp`.  
- Решение: использовать `asyncio.Lock()` или другие примитивы синхронизации.
Sophi
Софи собрала все вопросы. Тренируйся и получай
офферы быстрее!
Попробовать бесплатноArrow

Следующий вопрос

Это единственный вопрос по вашему фильтру

как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы