Можно ли уже использовать продолжения в Kotlin? Есть примеры?

В Kotlin есть пакет для продолжений, но он помечен как экспериментальный. Нет никакой документации, кроме API, а также никаких руководств или примеров, которые я мог бы найти. Кто-нибудь знает, можно ли его уже использовать? Что может быть примером его использования?


person user118967    schedule 08.09.2018    source источник


Ответы (2)


Интерфейс Continuation является частью API поддержки сопрограмм в стандартной библиотеке. Вы можете начать изучение сопрограмм на странице документации или на kotlinx.coroutines репозиторий библиотеки, который содержит обширное программирование сопрограмм. гид.

Корутины являются экспериментальными в Kotlin 1.1 и 1.2, но был объявление о том, что они собираются стабилизироваться в версии 1.3.

person Ilya    schedule 08.09.2018

Когда вы говорите «продолжения», вы на самом деле имеете в виду «сопрограммы». Продолжение — часть этой истории.

kotlin-coroutines-informal от JetBrains team — отличный ресурс, с которого можно начать работу с сопрограммами. Если вы хотите использовать их для асинхронного программирования на Android, обратите особое внимание на раздел обертывание обратных вызовов, которые предоставляет ваш существующий асинхронный API, превращая существующие вызовы функций Java в Kotlin suspend funs.

О статусе эксперимента см. ответ Романа Елизарова на этот вопрос. Вот основной момент:

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

Нет абсолютно никаких причин ждать 1.3, чтобы начать использовать сопрограммы. То, что вы напишете сегодня, будет работать в обозримом будущем без изменений, и, кроме того, будет очень легко переключиться с kotlinx.coroutines.experimental на kotlinx.coroutines после релиза. API уже очень стабильны, и большинство изменений теперь касаются каналов и участников.

person Marko Topolnik    schedule 09.09.2018
comment
Спасибо. Читая материал, мне кажется, что сопрограммы используют продолжения, но продолжения не доступны для приложений так же, как в Scheme, Scala (сброс и сдвиг), Haskell и т. д., верно? Мне было особенно интересно воспроизвести показанный здесь недетерминированный пример: /a> то есть я хотел узнать, есть ли в Котлине что-то эквивалентное захвату и побегу, используемому в статье. Это, по-видимому, подтверждается комментарием в «неофициальном» связанном документе о том, что продолжения нельзя возобновлять более одного раза. - person user118967; 11.09.2018
comment
Они определенно подвергаются воздействию приложения, см. answer для простого примера. Это семантическая бессмыслица возобновлять продолжение дважды, потому что это соответствует вычислению, происходящему с точки приостановки. Нельзя откатиться в прошлое. Когда сопрограмма снова приостанавливается, вы получаете еще один объект продолжения. Другие языки делают то же самое, просто имеют разные определения понятий. - person Marko Topolnik; 11.09.2018
comment
Что касается вашей основной ссылки, я нахожу это объяснение ужасно запутанным, есть гораздо лучшие способы объяснить эти концепции. Это материал только для высоко мотивированных энтузиастов. Я не тратил много времени на недетерминированную часть, но я видел нечто подобное, реализованное на Ruby. По сути, это своего рода решение ограничения обратного распространения. Я не видел аналога в Kotlin, но было бы интересно посмотреть, будет ли он работать с сопрограммами. - person Marko Topolnik; 11.09.2018
comment
Спасибо, Марко. Интересно, я нашел объяснение сути одним из лучших продолжений, которые я нашел до сих пор. :-) В любом случае, я не уверен в вашем утверждении, что запускать продолжение дважды - это семантическая чепуха. На самом деле, как я понимаю, это важно для недетерминизма, потому что вы запускаете одно и то же продолжение для двух разных альтернативных значений. Люди иногда называют продолжения способом путешествия в прошлое и путешествия во времени: blog.knoldus.com/ - person user118967; 11.09.2018
comment
Я, вероятно, должен смягчить свое заявление о том, что выполнение продолжений дважды необходимо для недетерминизма. Действительно, это, кажется, самый распространенный вариант их использования. Однако я вижу ссылки на получение недетерминизма с помощью генераторов. Поиск недетерминированности с помощью генераторов возвращает некоторые ссылки, но мне все еще нужно их переварить. - person user118967; 11.09.2018
comment
Семантическая бессмыслица относится к определению продолжения в Котлине, которое, на мой взгляд, более чистое. Вы не можете путешествовать в прошлое, это просто алегория. Между вашими вызовами продолжения мир изменился, само продолжение могло изменить его (побочные эффекты), поэтому вы просто повторно вводите тот же код в новом мире. Состояние, которое он зафиксировал в своем стеке вызовов, может быть устаревшим. Но в Kotlin можно организовать цикл в сопрограмме, чтобы получить очень похожий эффект, но более явный. Вы приостанавливаете сопрограмму на каждой итерации. - person Marko Topolnik; 11.09.2018