Как Kotlin coroutines лучше, чем RxKotlin?

Почему я хочу использовать сопрограммы Kotlin?

Похоже, библиотека RxKotlin намного более разнообразна. Kotlin coroutines выглядит значительно менее мощным и более громоздким для использования в сравнении.

Я основываю свое мнение на сопрограмме на этом дизайне, написанном Андреем Бреславом (JetBrains): https://www.youtube.com/watch?v=4W3ruTWUhpw

Слайд-шоу из разговоров доступно здесь: https://www.slideshare.net/abreslav/jvmls-2016-coroutines-in-kotlin

В Rx есть две части; Наблюдаемый шаблон и сплошной набор операторов для манипулирования, преобразования и комбинирования. Наблюдаемый шаблон сам по себе не делает много. Так делают Corouts; это просто еще одна парадигма, связанная с асинхронизмом. Вы можете сравнить про / минусы обратных вызовов, Observable и сопрограммы для решения данной проблемы, но вы не можете сравнить парадигму с полнофункциональной библиотекой. Это похоже на сравнение языка с каркасом.

Как Kotlin coroutines лучше, чем RxKotlin? Пока не использовали сопрограммы, но он похож на async / wait в C #. Вы просто пишете последовательный код, все так же просто, как писать синхронный код … за исключением того, что он выполняется асинхронно. Это легче понять.

Почему я хочу использовать kotlin сопрограммы? Я отвечу для себя. В большинстве случаев я буду придерживаться Rx, потому что я пользуюсь архитектурой, управляемой событиями. Но должна возникнуть ситуация, когда я пишу последовательный код, и мне нужно вызвать асинхронный метод посередине, я с удовольствием использую сопрограммы, чтобы сохранить его таким образом и избегая обертывания всего в Observable.

Kotlin coroutines отличаются от Rx. Трудно сравнивать их с яблоками и яблоками, потому что Kotlin coroutines – это тонкая языковая функция (всего лишь пара базовых понятий и несколько основных функций для их управления), а Rx – довольно тяжелая библиотека с довольно большим разнообразием готовые к использованию операторы. Оба они предназначены для решения проблемы асинхронного программирования, однако их подход к решению очень отличается:

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

  • Kotlin coroutines предоставляют языковую функцию, позволяющую библиотечным писателям реализовать различные стили асинхронного программирования, включая, но не ограничиваясь функциональным реактивным стилем (Rx). С сопрограммами Kotlin вы также можете написать свой асинхронный код в императивном стиле, в стиле с обещаниями / фьючерсами, в актерском стиле и т. Д.

Уместнее сравнить Rx с некоторыми конкретными библиотеками, которые реализованы на основе сопроводительных материалов Kotlin.

В качестве примера возьмите библиотеку kotlinx.coroutines . Эта библиотека предоставляет набор примитивов, таких как async/await и каналы, которые обычно запекаются на других языках программирования. Он также поддерживает легковесные субъекты, не имеющие отношения к будущему. Более подробно вы можете прочитать в руководстве по kotlinx.coroutines на примере .

Каналы, предоставляемые kotlinx.coroutines могут заменить или увеличить Rx в определенных случаях использования. Существует отдельное руководство по реактивным потокам с сопрограммами, которые углубляются в сходства и различия с Rx.

В разговоре / документе вы не говорите о каналах. Каналы – это то, что заполняет пробел между вашим текущим пониманием сопрограмм и программированием, управляемым событиями.

С сопрограммами и каналами вы можете программировать на основе событий, так как вы, вероятно, привыкли делать с rx, но можете сделать это с синхронным кодом и без так много «пользовательских» операторов.

Если вы хотите это лучше понять, я предлагаю взглянуть за пределы котлина, где эти концепции более зрелые и утонченные (не экспериментальные). Посмотрите на core.async из core.async Clojure, Rich Hickey, сообщений и связанных дискуссий.