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

[Kotlin] Coroutine 소개 (그렇지만 조금 깊을 수도 있음..)

by 돼지왕 왕돼지 2018. 11. 27.
반응형

[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





반응형

댓글