Как работают корутины в Kotlin

kotlin

Раз­работ­чики Kotlin называ­ют корути­ны лег­ковес­ными потока­ми. Одна­ко такое объ­ясне­ние не помога­ет понять их сути и даже меша­ет это­му. На самом же деле корути­ны доволь­но прос­тая, но мало похожая на потоки кон­цепция.

РЕКОМЕНДУЕМ:

Что­бы разоб­рать­ся с корути­нами (coroutine), надо понять, что такое routine. А это не что иное, как фун­кция. Нап­ример, такая:

Две отли­читель­ные чер­ты фун­кций:

  • они не име­ют сос­тояния и всег­да запус­кают­ся «с чис­того лис­та» (если, конеч­но, не исполь­зуют гло­баль­ные перемен­ные);
  • фун­кция дол­жна завер­шить свое исполне­ние, перед тем как вер­нуть управле­ние выз­вавше­му ее коду.

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

Ес­ли мы поп­робу­ем вруч­ную пре­обра­зовать при­веден­ную выше фун­кцию в корути­ну, то получим неч­то вро­де это­го:

Те­перь мы можем запус­тить нашу доморо­щен­ную «корути­ну» на выпол­нение с помощью такого кода:

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

Имен­но так работа­ют корути­ны в Kotlin. Он прев­раща­ет фун­кции с модифи­като­ром suspend в объ­ект клас­са Continuation, который внут­ри пред­став­ляет собой при­мер­но такую же машину сос­тояний, которую мы изоб­рели чуть выше. Точ­ки оста­нов­ки при этом появ­ляют­ся в мес­тах вызова дру­гих suspend-фун­кций.

Lets build a coroutine — хорошая статья, объ­ясня­ющая на паль­цах, как работа­ют корути­ны в Kotlin и дру­гих язы­ках.

Понравилась статья? Поделиться с друзьями:
Добавить комментарий