본문 바로가기
프로그래밍 놀이터/Kotlin

[Kotlin] Coroutine 소개

by 돼지왕왕돼지 2020. 8. 24.




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 에 대한 조금 더 깊은 내용

Coroutine tutorial 의 진입점



-

끝!!




댓글0