프로그래밍 놀이터/안드로이드, Java

[RxJava] 햇갈리던 subscribeOn, observeOn 의 thread 관계 정리

돼지왕 왕돼지 2021. 5. 7. 14:04
반응형

 

-

 

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

 

끝!!

 

 

반응형