Встречается на собеседованиях • сегодня
Возможна ли гонка между корутинами в одном потоке
Да, гонка (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()` или другие примитивы синхронизации.
Софи собрала все вопросы. Тренируйся и получай
офферы быстрее!
офферы быстрее!
Попробовать бесплатно
Следующий вопрос
Это единственный вопрос по вашему фильтру
как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы