> Несколько вопросов по корутинам. Обсудим?
> Q1. Как связаны понятия - нативный поток (поток операционной системы), легковесный поток и корутины?
Сразу с козырей зашли.
Сразу из головы я могу вспомнить несколько схожих понятий: корутина, копрограмма, лекговесный поток, зеленый поток, файбер, горутина, горрутина и т.д. Я их для себя никак не разграничиваю и называю одним словом - "корутина". Ее отличие от тредов в том, что корутиновый шедулер находится за пределами ядра ОС.
Корутины делятся на тех, что имеют стек и тех, кто его не имеет - stackful & stackless coroutines. В котлине корутины stackless, а в loom - stackful.
Все "зеленые" и "легкие" треды - stackful корутины. ЕМНИП, файберы тоже относятся к ним.
Еще одно отличие корутин от тредов в том, что у них _обычно_ многозадачность кооперативная, то есть они сами говорят шедулеру, что можно запустить на этом же потоке другую корутину (например, через функцию yield()), тогда как у тредов она вытесняющая.
> Q2. Могут ли несколько корутин выполняться внутри одного нативного потока?
Только если по очереди.
Корутины соотносятся с тредами так же, как и потоки с ядрами процессора (без гипертрединга). В один момент времени на одном треде может быть запущена только одна корутина.
> Q3. Могут ли несколько корутин выполняться в разных нативных потоках?
Да.
> Q4. Как правильно называется, когда корутина останавливает свою работу - сон, остановка, пауза (sleeping, suspending, pause)?
Я привык придерживаться suspend/resume. Вики со мной согласна:
https://en.wikipedia.org/wiki/Coroutine> Q5. Как корутина понимает, что сейчас время её для остановки/для возобновления?
Для suspend'а надо ей явно об этом сказать (suspendCoroutine), а resume делается рантаймом/шедулером.
> Q6. Чем отличаются диспетчеры для IO и для UI , и каковы рекомендации или противопоказания для их использования?
Из документации:
IO: The [CoroutineDispatcher] that is designed for offloading blocking IO tasks to a shared pool of threads.
Main (UI): A coroutine dispatcher that is confined to the Main thread operating with UI objects. Usually such dispatcher is single-threaded.
Если надо что-то отрисовать, то без IO вы получите ошибку. С другой стороны, блокировать UI тред - не очень хорошая идея. Поэтому блокирующие IO операции (типа чтения из БД) лучше вынести в IO.
> Q7. Каковы отличия корутин от аналогичных понятий в других языках программирования (C#, JS-генераторы)?
Принципиальных отличий котлиновских suspend функций от async функций в других языках нет. Про генераторы я отошлю к вики:
https://en.wikipedia.org/wiki/Coroutine#Comparison_with_generators> Q8. Поддерживат ли Kotlin Native корутины?
Да.