Coroutines Scope Builder 사용하기
coroutineScope builder은 일시 중단 함수 내부에서 복수의 동시 작업을 수행하기 위해 사용될 수 있다. doWorld 일시 중단 함수 내부에서 두 개의 동시에 수행되는 코루틴을 실행해보도록 하자.
import kotlinx.coroutines.*
// doWorld와 "Done"을 순서대로 실행합니다.
fun main() = runBlocking {
doWorld()
println("Done")
}
// 두 섹션들을 모두 동시적으로 실행합니다
suspend fun doWorld() = coroutineScope { // this: CoroutineScope
launch {
delay(2000L)
println("World 2")
}
launch {
delay(1000L)
println("World 1")
}
println("Hello")
}
📌 전체 코드는 이곳에서 확인할 수 있습니다.
launch { ... } 블록 내부의 두 코드들은 동시적으로 실행되어, 시작 후 1초가 지난 다음 "World 1"이 먼저 출력되고, 시작 후 2초가 지난 후에 "World 2"가 출력된다. doWorld의 coroutineScope은 이 둘 모두가 완료된 후에 종료되며, 그 후에야 doWorld가 반환되고 "Done" 문자열이 출력된다.
Hello
World 1
World 2
Done
📖 아래 내용은 독자의 이해를 위해 번역자가 추가한 글입니다.
*1. 중괄호 { ... } 내부의 코드를 뜻한다.
*2. 자식 Coroutine 을 뜻한다.
*3. 이전 코드는 다음과 같다.
import kotlinx.coroutines.*
fun main() = runBlocking {
launch {
delay(1000L)
println("World!")
}
println("Hello")
}
이 글은 Coroutines 공식 문서를 번역한 글입니다.
원문 : Coroutines Basics - Scope builder , Coroutines Basics - Scope builder and concurrency
원문 최종 수정 : 2022년 6월 27일
Coroutine Job 명시적으로 사용하기
launch Coroutine builder는 실행된 Coroutine을 처리하고 완료를 명시적으로 기다리도록 하는데 사용할 수 있는 Job 객체를 반환한다. 예를 들어, 자식 코루틴이 완료될 때까지 기다린 다음 "Done" 문자열을 출력하도록 할 수 있다.
import kotlinx.coroutines.*
fun main() = runBlocking {
val job = launch { // 새로운 코루틴을 실행하고 그 Job에 대한 참조를 유지한다
delay(1000L)
println("World!")
}
println("Hello")
job.join() // 자식 코루틴이 완료될 때까지 기다린다.
println("Done")
}
📌 전체 코드는 이곳에서 확인할 수 있습니다.
Hello
World!
Done
이 글은 Coroutines 공식 문서를 번역한 글입니다.
원문 : Coroutines Basics - An explicit job
원문 최종 수정 : 2022년 6월 27일
Coroutines는 light-weight 이다
Coroutines는 JVM의 Thread들보다 덜 리소스 집약적이다. Thread를 사용할 때 JVM의 가용 메모리를 소진시키지는 코드는 Coroutine을 사용하여 리소스의 제한치에 도달하지 않도록 표현될 수 있다. 예를 들어, 다음의 코드는 각각이 5초간 기다린 후 마침표('.)를 출력하는 100,000개의 별개의 Coroutine을 실행하면서도 매우 적은 메모리만을 사용한다.
import kotlinx.coroutines.*
fun main() = runBlocking {
repeat(100_000) { // 많은 수의 코루틴을 실행한다.
launch {
delay(5000L)
print(".")
}
}
}
📌 전체 코드는 이곳에서 확인할 수 있습니다.
만약 위와 같은 프로그램을 Thread들을 이용하여 작성한다면(runBlocking을 제거하고 launch를 thread로 대체하고, delay를 Thread.sleep으로 대체), 많은 메모리를 사용하게 되어 out-of-memory error을 발생시킬 것이다.
이 글은 Coroutines 공식 문서를 번역한 글입니다.
원문 : Coroutines Basics - Coroutines are light-weight
원문 최종 수정 : 2022년 6월 27일
목차로 돌아가기