코루틴의 주요 특징
경량성 1개의 스레드에는 여러개의 코루틴이 실행될 수 있고, 스레드보다 메모리 소모가 적기 때문에, 수천 개의 코루틴을 실행할 수 있습니다.
비동기 작업을 순차적으로 작성할 수 있습니다.
콜백 지옥을 제거하고 코드 가독성을 향상 시킵니다.
코루틴은 특정 지점에서 실행을 중단했다가 재개할 수 있습니다.
이를 통해 I/O 작업이나 네트워크 호출과 같은 비동기 작업이 가능합니다.
코루틴은 특정 스레드에 종속되지 않고 스레드 풀에서 자동으로 스레드를 전환합니다.
스레드와 차이점
OS의 링크되어 동작하므로 많은 시스템의 자원을 사용
Thread간 전환 시에도 CPU의 상태 체크가 필요하므로 그만큼의 비용이 발생
코루틴은 즉시 실행되는게 아니고 OS의 영향을 받지 않기에 비용이 절약된다.
Coroutine 전환 시 Context Switch가 발생하지 않음
개발자가 직접 루틴을 언제 실행할지, 언제 종료할지 모두 지정이 가능하다.
이렇게 생성한 루틴은 작업 전환 시에 시스템의 영향을 받지 않아, 그에 따른 비용이 발생하지 않음
[참고자료] https://stackoverflow.com/questions/43021816/difference-between-a-thread-and-a-coroutine-in-kotlin
코루틴의 주요 특징
[참고자료] https://kotlinlang.org/docs/coroutines-basics.html#your-first-coroutine
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
}
launch는 Coroutine Builder이다. launch는 독립적으로 동작하는 새로운 Coroutine을 나머지 코드와 동시에 실행되도록 한다. 이로 인해 Hello가 처음에 출력된다.
delay는 특별한 일시중단 함수이다. delay는 Coroutine을 특정한 시간 동안 일시중단한다. Coroutine을 일시중단 하는 것은 Coroutine이 실행 중인 스레드를 블록 하지 않으며, 다른 Coroutine 이 해당 스레드에서 자신들의 코드를 실행할 수 있도록 한다.
runBlocking 또한 Coroutine Builder이다. runBlocking은 Coroutine 세계에 속하지 않은 일반적인 fun main() 과 runBlocking { ... } 중괄호 내부의 Coroutine 코드를 연결시켜 주는 역할을 한다. 이는 IDE 내에서 runBlocking 시작 중괄호 '{' 바로 다음에 오는 this: CoroutineScope 힌트로 강조표시된다.
launch는 Coroutine Scope 내에서만 실행될 수 있기 때문에, 만약 이 코드에서 runBlocking을 제거하거나 작성하는 것을 잊는다면, launch 호출 시에 애러가 발생할 것이다.
runBlocking: 코루틴 환경 만들기 (메인 스레드 차단).
launch: 비동기 작업 시작하기 (다른 작업과 동시에 실행).
delay: 일시중단 (스레드는 차단하지 않고 쉬기).