В Kotlin один поток может запускать только одну сопрограмму за раз?

Я понимаю сопрограммы и потоки Kotlin так:

Один поток может запускать только одну сопрограмму за раз. Поток может манипулировать несколькими сопрограммами. Он может приостановить сопрограмму и запустить другую сопрограмму. Но в данный момент времени в потоке будет работать только одна сопрограмма. Вы не можете запускать несколько сопрограмм в одном потоке в один и тот же момент времени.

Это правильно?


person Abhay P    schedule 05.10.2020    source источник
comment
Я предлагаю посмотреть это видео, в котором объясняется, как работают функции приостановки: Функции приостановки - Котлинский словарь   -  person Pawel    schedule 05.10.2020


Ответы (1)


Да, это правильно.

Сопрограмму можно рассматривать как последовательность инструкций, выполняемую потоком до тех пор, пока он не встретит точку приостановки, в которой сопрограмма приостанавливает свое выполнение (сохраняя стек вызовов и локальные переменные для возобновления позже) и передает управление, и в этом случае нет. дольше запускается в потоке, в котором он работал.

Это очень похоже на то, как функция, которая возвращает, больше не работает в потоке, возвращая управление вызывающему, но сопрограмма дополнительно сохраняет свое состояние, чтобы его можно было возобновить позже, в том же или другом потоке. Как только сопрограмма передает управление, поток возвращается к коду, который запустил или возобновил сопрограмму. Этот код может быть или не быть другой сопрограммой.

Вы можете думать о потоке как о примитиве более низкого уровня (уровня ОС или уровня JVM), чем сопрограммы. Весь код в приложении выполняется в каком-то потоке, по одной последовательности инструкций в каждом потоке за раз, и сопрограммы в этом смысле не являются исключением.

person hotkey    schedule 05.10.2020
comment
Другой способ думать об этом - это как цикл событий. У вас есть очередь, в которую добавляются задачи / сопрограммы, есть 1 поток (или более, например, Dispatchers.IO), который читает каждую задачу и запускает ее. Посмотрите на исходный код сопрограммы JVM, и вы увидите, что есть очередь для сопрограмм, а сопрограмма - это Runnable, который был обычным методом, но разделен на каждый раздел своих точек приостановки. - person lfmunoz; 14.10.2020