https://www.slideshare.net/elizarov/introduction-to-kotlin-coroutines
-
Coroutine 개념은 아주 오래된 녀석이다.
Simula 67 이란 언어에서 처음으로 소개된 개념이다.
detach : suspension statement
resume : resume coroutine execution
-
Coroutine 은 multithreading 이 나오면서 잠시 out 되어있었다.
그러나 최근에 async code 가 많이 사용되면서 다시 주목받기 시작했다.
-
Thread 는 resource 측면에서 high-load 이며,
single thread 만 지원하는 언어들도 있으며,
mutable state 가 많고, UI operation 같이 thread 를 쓸 수 없는 경우..
위와 같은 경우에 coroutine 이 필요하다.
-
classic async 는 callback 방식이다.
callback 의 단점은 callback hell 이라고 불리는 깊이 깊이 들어가는 현상
-
Future, Promises, rx.Single 은 아래와 같은 스타일을 가능하게 했다.
preparePostAsync() .thenCompose{ token -> submitPostAsync(token, item) } .thenAccept{ post -> processPost(post) }
그러나 이 경우에 여러가지 함수들에 대한 학습이 필요하다.
compose, handle, accept, apply, supply.. 어떤 걸 쓸 것인가?
-
kotlin coroutine 을 사용하면 이렇게 가능하다.
launch{ val token = preparePost() val post = submitPost(token, item) processPost(post) }
-
suspend fun submitPost(token:Token, item:Item) :Post { }
위 함수는 아래와 같이 변형된다.
Object submitPost(Token token, Item item, Continuation<Post> cont){ } interface Continuation<in T>{ val context: CoroutineContext fun resume(value:T) fun resumeWithException(exception:Throwable) }
-
val token = preparePost() val post = submitPost(token, item) processPost(post)
state machine 을 갖는 아래와 같이 변형된다.
switch( cont.label ){ case 0: cont.label = 1; preparePost(cont); break; case 1: Token token = (Token) prevResult; cont.label = 2; submitPost(token, item, cont) break; case 2: Post post = (Post) prevResult; processPost(post); break; }cont 를 받는 곳에서는 작업이 끝난 후에
cont.resume 또는 cont.resumeWithException 을 호출해주어 코드실행을 계속 이어준다.
-
kotlin 의 suspending function 은 sequential behavior 를 하는 것처럼 보이게 디자인됨.
-
suspend function 은 coroutine 안에서 또는 다른 suspend function 에서만 불릴 수 있다.
-
Coroutine 은 light-weight thread 라고 볼 수 있다.
-
async 는 Deferred<Result> 를 return 한다.
-
Kotlin language 자체는 suspend keyword 만 가지고 있다.
suspend function 을 callback 으로 바꾸어준다.
code 를 state machine 코드로 바꾸어준다.
stdlib 은 Continuation 과 CoroutineContext 를 가지고 있다.
나머지는 library 에 있다.
launch/join, async/await, runBlocking 등등
kotlinx.coroutines lib 을 써야 한다.
open source 이다.
-
다음의 것들도 공부해보시길..
Channel/Actors
Selection, synchronization
Job hierarchies, cancellation
buildSequence/yield ( restricted sync suspension )
Interop with other futures/promise/reactive libs
실제 구현 detail
-
기타 읽을거리
Coroutine StateMachine 에 대한 조금 더 깊은 내용
-
댓글