В чем разница корутин и потоков
Что проверяют
Понимаете ли вы, что корутина не поток, и можете ли объяснить, что происходит при приостановке.
Как отвечать
Поток это единица планирования операционной системы: свой стек (обычно около мегабайта), переключение через ядро, число ограничено тысячами.
Корутина это приостанавливаемая задача, выполняемая на потоке. Приостановка не блокирует поток: корутина сохраняет своё состояние и отдаёт поток другим задачам, а потом продолжает с той же точки. Создание стоит выделения небольшого объекта, поэтому сотни тысяч корутин это нормально.
Ключевое различие в том, что происходит при ожидании. Поток, ждущий сети, заблокирован и бесполезен. Корутина, ждущая сети, снимается с потока, и поток идёт выполнять другую корутину. При тысяче одновременных запросов это разница между тысячей потоков и десятком.
Технически компилятор превращает приостанавливаемую функцию в конечный автомат с продолжением, поэтому никакой магии в рантайме нет.
Что ещё стоит назвать: у корутин есть структурированная конкурентность, то есть область владеет потомками и отменяет их вместе с собой. У потоков ничего подобного нет: поток нельзя безопасно остановить снаружи, а отслеживание их жизни целиком на программисте.
Важная оговорка: корутины не отменяют проблем общего изменяемого состояния. Гонки возможны и там, потому что несколько корутин могут выполняться на разных потоках одновременно.
Где спотыкаются
Называют корутину лёгким потоком и на этом останавливаются.
Считают, что корутины дают параллелизм сами по себе: на одном потоке они конкурентны, но не параллельны.
Блокируют поток внутри корутины (Thread.sleep, синхронный вызов) и теряют весь смысл.
Уверены, что корутины избавляют от синхронизации.