Coroutine basics 번역하기

K_DRAGON·2022년 8월 26일
1
post-thumbnail

필자는 영어를 잘 못하기 때문에 사전과 파파고의 도움을 많이 받았으며 번역이 부정확할 수 있습니다.

Your first coroutine

코루틴은 정지할 수 있는 계산의 인스턴스입니다.

코루틴은 한 블록의 코드를 나머지 코드들과 동시에(병행적으로, concurrently) 실행된다는 측면에서 개념적으로 스레드와 비슷합니다 .

하지만 코루틴은 어떤 특정 스레드에도 묶여있지 않습니다.
코루틴은 한 스레드에서 실행을 일시 중단(지연)하고 다른 스레드를 다시 실행합니다.

코루틴은 가벼운 스레드라고 생각될 수 있지만, 실제 사용할 때 매우 다름을 만드는 여러 중요한 차이점들이 있습니다.

아래 코드를 살펴봅시다.

fun main() = runBlocking { // this: CoroutineScope
    launch { // launch a new coroutine and continue
        delay(1000L) // non-blocking delay for 1 second (default time unit is ms)
        println("World!") // print after delay
    }
    println("Hello") // main coroutine continues while a previous one is delayed
}

위 코드를 실행시키면 아래와 같은 결과가 나옵니다.

Hello
World!

이 코드가 어떻게 실행됐는지 살펴봅시다.

launch는 코루틴 빌더입니다. 이는 새로운 코루틴을 나머지 코드들과 동시에(병행적으로, concurrently) 시작하며 독립적으로 계속 작동합니다. 이것이 Hello가 먼저 출력된 이유입니다.

delay는 특별한 지연(suspending) 함수입니다. 이는 코루틴을 특정 시간동안 지연(중단, suspend)시킵니다. 코루틴을 일시 중단(suspend) 시키는 것은 기존(사용하던) 스레드를 막지(block) 않고 다른 코루틴이 그들의 코드를 위해 기존 스레드를 실행하고 사용할 수 있습니다.

runBlocking도 일반적인 메인 함수의 코루틴이 아닌 구역과 runBlocking중괄호 내부의 코루틴 코드들을 이어주는 코루틴 빌더입니다. 이것은 IDE에서 runBlocking을 시작하는 중괄호 바로 다음에 this:CoroutineScope힌트로 강조 표현된다.

만약 당신이 이 코드에서 runBlocking을 지우거나 깜빡한다면 launch를 호출할 때 다음과 같은 에러가 날 것입니다. launch는 CoroutineScope 안에서만 선언될 수 있기 때문입니다.

Unresolved reference: launch

runBlocking의 이름은 runBlocking 내부의 모든 코루틴의 실행이 완료될 때까지 이를 실행하는 스레드(이 경우엔 메인 스레드)가 호출 기간 동안 차단됨을 의미합니다. 애플리케이션의 최상위 수준에서는 이와 같이 사용되는 runBlocking을 종종 볼 수 있지만 실제 코드 내부(아마도 low level의 코드에서?를 의미하는듯 하다)에서는 거의 볼 수 없습니다. 스레드는 (코스트가) 비싼 리소스이며 스레드를 차단(block)하는 것은 비효율적이고 바람직하지 않기 때문입니다.

Structured concurrency (구조화된 동시성)

코루틴은 structured concurrency(구조화된 동시성)의 원칙을 따르는데, 이는 코루틴의 생명주기를 지정하는 특정한 CoroutineScope에서만 새로운 코루틴을 시작할 수 있다는 것을 의미한다. 위의 예제는 runBlocking이 해당 스코프(범위?)를 설정한다는 것을 보여주며, 이것이 이전 예제에서 1초의 딜레이 후, 'World!'가 출력될 때까지 기다린 다음에서야 종료되는 이유입니다.

실제 앱에서, 당신은 많은 코루틴을 실행할 것 입니다. structured concurrency(구조화된 동시성)은 그것들이 분실되고 누출되지 않도록 보장합니다. 모든 자식(하위) 코루틴들이 완료될 때까지 외부 스코프는 완료할 수 없습니다. 또한 structured concurrency(구조화된 동시성)은 코드의 모든 오류를 적절하게 알려주고 손실되지 않도록 보장합니다.

Extract function refactoring

continue.. 계속 번역하면서 업데이트 할게유

원본 출처

profile
개발자가 되어보자!

0개의 댓글