Pull to refresh

Comments 10

Я не андроид-разработчик, но разве корутины в котлине не следуют обычному cooperative multitasking, когда грубо говоря есть системный цикл который по очереди проходит по всем scheduled задачам (корутинам) и выполняет их насколько это возможно (если нет io, если прошёл delay, если завершилась отрисовка и т.д.)? Ну и соответственно пока не произойдёт переключение контекста (выход из контекста текущей задачи в системный цикл) - корутина не запустится.

Да, всё так, вот только есть несколько (независимых и не очень) системных циклов, которые делают ровно то, что Вы описали. По сути, любая корутина будет выполняться в одном из Dispatcher'ов.

Тогда не проще ли думать/объяснять корутины именно в контексте этих циклов? Ну, условно что join выходит из контекста задачи обратно у цикл, и задача не пойдёт в выполнение (будет пропущена в цикле) до тех пор пока не завершится ожидание помеченной join корутины. И ради иллюстраций взять обычную ladder diagram.

Кмк это намного проще для понимания чем "измерения" или "некоторое время на запуск"

Спасибо, подумаю над этим) Рассказывать просто о сложных вещах - это искусство, буду тренироваться)

Я джунам именно про цикл рассказывал, туда очень органично легли всякие sleep(0), опасность блокировки цикла cpu-bound задачами, очереди, порядок выполнения и прочее. Но я питонист, в питоне судя по другим комментам проще чем в котлине, по умолчанию loop только один.

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

В сабжевом коде нет системного цикла, завершается main, завершается процесс. Корутина не начинает выполняться.

Для начала работы корутины не обязательно завершение текущей задачи. Она может хоть навечно повиснуть, если в диспатчере будут свободные потоки, корутина запустится на одном из них.

ТСа хочется с подключением поздравить:)

И свой цикл есть у каждого потока и пул задач между ними общий?

По-умолчанию в JVM у "сырых" потоков нет цикла. В примере есть поток, на котором выполняется main, в нем, соответственно, нет цикла.

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

Если всобачить перед окончанием main Thread.sleep(1000), то код корутины успеет выполниться.

Осталось узнать про main.immediate и пример без delay будет иметь иное поведение. А ещё с coroutine start поиграться. Но вообще странно это приводить как пример, это вроде описано.

Sign up to leave a comment.

Articles