[RxJava] 햇갈리던 subscribeOn, observeOn 의 thread 관계 정리
-
subscribeOn 은 최초 호출의 것만 valid 하고, 그 이후에 사용하는 것은 모두 무시된다.
-
subscribeOn 은 처음 시작부분의 thread 를 결정하고, observeOn 을 만나는 순간부터 observeOn 에서 명시한 thread 로 변경된다.
-
just 를 사용하면 subscribe 시점이 아니라, 호출되는 시점에 바로 연산이 수행된다.
subscribeOn 에서 명시한 thread 가 아닌 just 를 호출한 thread 에서 바로 호출된다.
메인에서 호출하면 loadDataSync 자체는 mainThread 에서 연산된다는 것이다.
그림에서 빨간 줄이 약간 혼란스러움을 줄 수 있는데,
subscribing 자체는 io thread 에서 잘 수행된다.
이 말은 연산 자체는 호출 thread 에서 하지만, 그 결과값을 가지고 emit 하는 과정은 io thread 에서 한다는 의미이다.
이 문제를 해결하려면 heavy 연산에 대해서는 just 를 사용하면 안 되고, defer 를 써서 연산을 미루는 것이 좋다.
-
위 연산은 flatMap 안의 loadData 가 parallel 하게 작동하도록 기대하고 작성한 코드라고 한다.
그러나 실제로 돌려보면 subscribeOn 이 io thread 1개에서 수행되기 때문에..
id1 하나가 발급되어 loadData 하여 flatMap 이 되고, 그 다음 id2 하나가 발급되어 loadData 하여 flatMap 이 되는 형태로 sequential 하게 작동한다.
parallel 수행을 이루기 위해서는 loadData 자체에 subscribeOn 을 붙여주어야 한다.
그래야 각각의 observable 이 각각의 io thread 를 차지할 수 있다.
-
마지막으로 subscribeOn 과 observeOn 을 명시해주지 않으면 sync 수행이라고 볼 수 있다.
mainThread 에서 이렇게 호출하는 것은 상황에 따라 지양해야 할 수 있다.
-
위에 링크로 달려 있는 글에서는 이어서 Kotlin flow 에 대한 이야기를 다룬다.
하지만 내가 정리하고 싶었던 부분은 subscribeOn, observeOn 의 햇갈리는 포인트들이라 여기까지만 정리한다.
-
참고자료 : https://proandroiddev.com/from-rxjava-2-to-kotlin-flow-threading-8618867e1955
끝!!