Ответ
Корутины легковесны за счет:
- Отсутствия накладных расходов на переключение контекста - они работают в рамках одного потока, переключаясь на уровне языка, а не ОС.
- Минимального потребления памяти - каждая корутина занимает всего несколько десятков байт в куче (vs потоки ~1MB).
- Кооперативной многозадачности - корутины добровольно передают управление, а не вытесняются принудительно.
Пример:
fun main() = runBlocking {
repeat(100_000) { // Легко запустить 100К корутин
launch {
delay(1000L)
print(".")
}
}
}
// С потоками такое невозможно из-за высокого потребления ресурсов