필자는 영어를 잘 못하기 때문에 사전과 파파고의 도움을 많이 받았으며 번역이 부정확할 수 있습니다.
코루틴은 정지할 수 있는 계산의 인스턴스입니다.
코루틴은 한 블록의 코드를 나머지 코드들과 동시에(병행적으로, 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(구조화된 동시성)의 원칙을 따르는데, 이는 코루틴의 생명주기를 지정하는 특정한 CoroutineScope에서만 새로운 코루틴을 시작할 수 있다는 것을 의미한다. 위의 예제는 runBlocking
이 해당 스코프(범위?)를 설정한다는 것을 보여주며, 이것이 이전 예제에서 1초의 딜레이 후, 'World!'가 출력될 때까지 기다린 다음에서야 종료되는 이유입니다.
실제 앱에서, 당신은 많은 코루틴을 실행할 것 입니다. structured concurrency(구조화된 동시성)은 그것들이 분실되고 누출되지 않도록 보장합니다. 모든 자식(하위) 코루틴들이 완료될 때까지 외부 스코프는 완료할 수 없습니다. 또한 structured concurrency(구조화된 동시성)은 코드의 모든 오류를 적절하게 알려주고 손실되지 않도록 보장합니다.
continue.. 계속 번역하면서 업데이트 할게유