Development Tip

Kotlin 코 루틴이 RxKotlin보다 얼마나 나은가요?

yourdevel 2020. 12. 6. 22:08
반응형

Kotlin 코 루틴이 RxKotlin보다 얼마나 나은가요?


Kotlin 코 루틴을 사용하는 이유는 무엇입니까?

RxKotlin 라이브러리가 훨씬 더 다재다능한 것 같습니다. Kotlin 코 루틴은 비교에서 사용하기에 훨씬 덜 강력하고 번거 롭습니다.

저는 Andrey Breslav (JetBrains)의이 디자인 토크에서 코 루틴에 대한 의견을 내놓았습니다 : https://www.youtube.com/watch?v=4W3ruTWUhpw

토크의 슬라이드 쇼는 여기에서 액세스 할 수 있습니다. https://www.slideshare.net/abreslav/jvmls-2016-coroutines-in-kotlin


수정 (@hotkey 덕분에) :

코 루틴의 현재 상태에 대한 더 나은 소스 : https://github.com/Kotlin/KEEP/blob/master/proposals/coroutines.md


Rx에는 두 부분이 있습니다. Observable 패턴과이를 조작, 변환 및 결합하기위한 견고한 연산자 세트. Observable 패턴은 그 자체로 많은 일을하지 않습니다. 코 루틴과 동일합니다. 비동기를 다루는 또 다른 패러다임 일뿐입니다. 콜백, Observable 및 코 루틴의 장단점을 비교하여 주어진 문제를 해결할 수 있지만 패러다임을 완전한 기능을 갖춘 라이브러리와 비교할 수는 없습니다. 언어를 프레임 워크와 비교하는 것과 같습니다.

Kotlin 코 루틴이 RxKotlin보다 어떻게 더 낫습니까? 아직 코 루틴을 사용하지 않았지만 C #의 async / wait와 비슷해 보입니다. 순차 코드를 작성하기 만하면 모든 것이 동기 코드를 작성하는 것만 큼 쉽습니다. 이해하기가 더 쉽습니다.

kotlin 코 루틴을 사용하는 이유는 무엇입니까? 나는 스스로 대답 할 것이다. 이벤트 중심 아키텍처를 선호하기 때문에 대부분의 경우 Rx를 고수 할 것입니다. 그러나 순차 코드를 작성하고 중간에 비동기 메서드를 호출해야하는 상황이 발생하면 코 루틴을 기꺼이 활용하여 모든 것을 Observable에 래핑하지 않도록 할 것입니다.

편집 : 이제 코 루틴을 사용하고 있으므로 업데이트 할 시간입니다.

RxKotlin은 Kotlin에서 RxJava를 사용하기위한 구문 설탕 일 뿐이므로 다음에서 RxKotlin이 아닌 RxJava에 대해 설명하겠습니다. 코 루틴은 RxJava보다 레버가 낮고 더 일반적인 개념이며 다른 사용 사례를 제공합니다. 즉, RxJava와 코 루틴 ( channel)을 비교할 수있는 사용 사례가 하나 있는데 , 데이터를 비동기 적으로 전달합니다. 코 루틴은 RxJava에 비해 분명한 이점이 있습니다.

코 루틴은 리소스를 다루는 것이 더 좋습니다.

  • RxJava에서는 스케줄러에 계산을 할당 할 수 있지만, subscribeOn()ObserveOn()혼동된다. 모든 코 루틴에는 스레드 컨텍스트가 주어지고 상위 컨텍스트로 돌아갑니다. 채널의 경우 양쪽 (프로듀서, 소비자)이 자신의 컨텍스트에서 실행합니다. 코 루틴은 스레드 또는 스레드 풀 영향에 대해 더 직관적입니다.
  • 코 루틴은 이러한 계산이 발생할 때 더 많은 제어를 제공합니다. 예를 들어 주어진 계산에 대해 hand ( yield), Prioritize ( select), parallelize (multiple producer/ actoron channel) 또는 lock resource ( Mutex)를 전달할 수 있습니다 . 서버 (RxJava가 먼저 나온 곳)에서는 중요하지 않을 수 있지만 리소스가 제한된 환경에서는이 수준의 제어가 필요할 수 있습니다.
  • 반응 적 특성으로 인해 배압은 RxJava에 적합하지 않습니다. 다른 쪽 끝 send()에서 채널은 채널 용량에 도달하면 일시 중단되는 일시 중지 기능입니다. 그것은 본질적으로 제공되는 즉시 사용 가능한 배압입니다. 당신은 또한 수 offer()있는 경우 통화가 중단 적이 있지만, 수익, 채널에 false효과적으로 재현, 채널이 가득 경우 onBackpressureDrop()RxJava에서. 또는 코 루틴에서 특히 RxJava에서 동일한 작업을 수행하는 것과 비교하여 어렵지 않을 사용자 지정 배압 로직을 작성할 수도 있습니다.

코 루틴이 빛을 발하는 또 다른 사용 사례가 있습니다. 그러면 두 번째 질문 인 "왜 Kotlin 코 루틴을 사용하고 싶습니까?"라고 답할 것입니다. 코 루틴은 백그라운드 스레드 또는 AsyncTask(Android) 를 완벽하게 대체합니다 . 그것은만큼 쉽다 launch { someBlockingFunction() }. 물론 당신은 사용도 RxJava에이를 수 SchedulersCompletable아마. RxJava의 서명 인 Observer 패턴과 연산자를 사용하지 않을 것입니다. 이는이 작업이 RxJava의 범위를 벗어난다는 힌트입니다. RxJava 복잡성 (여기서는 쓸모없는 세금)은 코드를 Coroutine 버전보다 더 장황하고 덜 깔끔하게 만듭니다.

가독성이 중요합니다. 이와 관련하여 RxJava와 코 루틴 접근 방식은 많이 다릅니다. 코 루틴은 RxJava보다 간단합니다. 당신이 편안하지 않은 경우 map(), flatmap()일반적으로 기능적 반응 프로그래밍, 코 루틴 조작은 기본 지침을 포함하는, 쉽게 : for, if, try/catch...하지만 개인적이 아닌 사소한 작업을 위해 이해하기 위해 코 루틴의 코드 열심히 찾을 수 있습니다. 특히 RxJava의 연산자 체인은 모든 것을 일렬로 유지하는 반면 더 많은 중첩과 들여 쓰기가 필요합니다. 함수형 프로그래밍은 처리를보다 명시 적으로 만듭니다. 또한 RxJava는 풍부한 (OK, 너무 풍부한) 연산자 집합의 몇 가지 표준 연산자로 복잡한 변환을 해결할 수 있습니다. RxJava는 많은 조합과 변환이 필요한 복잡한 데이터 흐름이있을 때 빛납니다.

이러한 고려 사항이 귀하의 요구에 맞는 올바른 도구를 선택하는 데 도움이되기를 바랍니다.


Kotlin 코 루틴은 Rx와 다릅니다. Kotlin 코 루틴은 얇은 언어 기능 (기본 개념 몇 개와이를 조작하기위한 몇 가지 기본 기능 포함)이기 때문에 비교하기가 어렵지만 Rx는 매우 다양한 즉시 사용 가능한 운영자. 둘 다 비동기 프로그래밍 문제를 해결하도록 설계되었지만 솔루션에 대한 접근 방식은 매우 다릅니다.

  • Rx는 언어 자체의 지원없이 거의 모든 프로그래밍 언어로 구현할 수있는 특정 기능적 프로그래밍 스타일을 제공합니다. 당면한 문제가 일련의 표준 연산자로 쉽게 분해 될 때 잘 작동하고 그렇지 않으면 잘 작동하지 않습니다.

  • Kotlin 코 루틴은 라이브러리 작성자가 Rx (Functional Reactive Style)를 포함하되 이에 국한되지 않는 다양한 비동기 프로그래밍 스타일을 구현할 수있는 언어 기능을 제공합니다. Kotlin 코 루틴을 사용하면 명령형, 약속 / 미래 기반 스타일, 액터 스타일 등으로 비동기 코드를 작성할 수도 있습니다.

Rx를 Kotlin 코 루틴을 기반으로 구현 된 일부 특정 라이브러리와 비교하는 것이 더 적절합니다.

가지고 kotlinx.coroutines 라이브러리를 하나의 예로서. 이 라이브러리는 async/await일반적으로 다른 프로그래밍 언어로 구워지는 채널 과 같은 기본 요소 세트를 제공합니다 . 또한 경량의 미래가없는 배우를 지원합니다. 자세한 내용은 kotlinx.coroutines 가이드에서 예제로 읽을 수 있습니다 .

에서 제공하는 채널 kotlinx.coroutines은 특정 사용 사례에서 Rx를 대체하거나 확장 할 수 있습니다. Rx와의 유사점과 차이점에 대해 자세히 설명 하는 코 루틴 이있는 반응 스트림에 대한 별도의 가이드가 있습니다.


링크 한 대화 / 문서는 채널에 대해 설명하지 않습니다. 채널은 코 루틴에 대한 현재 이해와 이벤트 기반 프로그래밍 사이의 격차를 채우는 것입니다.

코 루틴과 채널을 사용하면 아마도 rx에서 사용했던 것처럼 이벤트 기반 프로그래밍을 수행 할 수 있지만 많은 "사용자 지정"연산자없이 동기식 코드로 수행 할 수 있습니다.

이것을 더 잘 이해하고 싶다면, 그 개념이 더 성숙하고 세련된 (실험적이지 않은) kotlin의 외부를 살펴 보는 것이 좋습니다. core.asyncClojure, Rich Hickey 비디오, 게시물 및 관련 토론에서 살펴보십시오 .

참고 URL : https://stackoverflow.com/questions/42066066/how-kotlin-coroutines-are-better-than-rxkotlin

반응형