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 (multipleproducer
/actor
onchannel
) 또는 lock resource (Mutex
)를 전달할 수 있습니다 . 서버 (RxJava가 먼저 나온 곳)에서는 중요하지 않을 수 있지만 리소스가 제한된 환경에서는이 수준의 제어가 필요할 수 있습니다. - 반응 적 특성으로 인해 배압은 RxJava에 적합하지 않습니다. 다른 쪽 끝
send()
에서 채널은 채널 용량에 도달하면 일시 중단되는 일시 중지 기능입니다. 그것은 본질적으로 제공되는 즉시 사용 가능한 배압입니다. 당신은 또한 수offer()
있는 경우 통화가 중단 적이 있지만, 수익, 채널에false
효과적으로 재현, 채널이 가득 경우onBackpressureDrop()
RxJava에서. 또는 코 루틴에서 특히 RxJava에서 동일한 작업을 수행하는 것과 비교하여 어렵지 않을 사용자 지정 배압 로직을 작성할 수도 있습니다.
코 루틴이 빛을 발하는 또 다른 사용 사례가 있습니다. 그러면 두 번째 질문 인 "왜 Kotlin 코 루틴을 사용하고 싶습니까?"라고 답할 것입니다. 코 루틴은 백그라운드 스레드 또는 AsyncTask
(Android) 를 완벽하게 대체합니다 . 그것은만큼 쉽다 launch { someBlockingFunction() }
. 물론 당신은 사용도 RxJava에이를 수 Schedulers
와 Completable
아마. 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.async
Clojure, Rich Hickey 비디오, 게시물 및 관련 토론에서 살펴보십시오 .
- http://discuss.purelyfunctional.tv/t/core-async-channels-vs-rx-observables/519/2
- https://github.com/matthiasn/talk-transcripts/blob/master/Hickey_Rich/CoreAsync.md
참고 URL : https://stackoverflow.com/questions/42066066/how-kotlin-coroutines-are-better-than-rxkotlin
'Development Tip' 카테고리의 다른 글
클릭시 Vue.js 토글 클래스 (0) | 2020.12.06 |
---|---|
ngModel을 사용하여 부모 formGroup 지시문으로 양식 컨트롤을 등록 할 수 없습니다. (0) | 2020.12.06 |
python 및 sys.argv (0) | 2020.12.06 |
.NET 타이머가 15ms 분해능으로 제한되는 이유는 무엇입니까? (0) | 2020.12.05 |
Visual Studio없이 Visual C ++ 명령 줄 컴파일러를 다운로드 할 수 있습니까? (0) | 2020.12.05 |