[Kotlin] Coroutine 소개 |
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)
}
.thenAccep{ post ->
processPost(post)
}
그러나 이 경우에 여러가지 함수들에 대한 학습이 필요하다.
compose, handle, accept, apply, supply.. 어떤 걸 쓸 것인가?
-
kotlin coroutine 을 사용하면 이렇게 가능하다.
launch{
val token = preparePost()
val post = submitPost(token, item)
processPost(post)
}
-
suspend function 코드는
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
'프로그래밍 놀이터 > Tips' 카테고리의 다른 글
[DSA] Search & Sorting Algorithm Tutorial (0) | 2019.01.13 |
---|---|
[Data Structure] HashMap 보다 Tree 를 써야 하는 곳에 대해 알아보면서 알게 된 내용들 (0) | 2019.01.12 |
[실용주의 프로그래머] 총 정리 (0) | 2018.11.19 |
[실용주의 프로그래머] 오만과 편견 (0) | 2018.11.18 |
[실용주의 프로그래머] 위대한 유산 (0) | 2018.11.17 |
댓글