coroutine 을 통해서 알아야할것 : 각종 키워드들에 대한 정확한 이해.
GlobalScope.launch: 새로운 코루틴을 백그라운드에서 실행하고 (기존프로세스들은)진행한다.
runblocking: 메인 쓰레드를 블록하고 실행한다.
넌블로킹 비동기 작업을 수행하기 위해 코틀린은 코루틴이라는 개념을 지원한다. 대부분의 언어들은 비동기 작업을 가능하게 하기위해 새로운 쓰레드를 생성하여 프로세스간 문맥 교환(context switching) 을 발생시키지 않고 동시에 작업이 진행될 수 있도록 작업할 수 있다.
코틀린은 이것보다 더 간편하게 동시작업을 위한 작업이 쓰레드생성으로 가능한 것이 아닌 그것보다 더 경량의 비동기 함수를 통해서 비선점형으로 작업되는 협력형 멀티태스킹(cooperative multitasking)을 구현할 수 있게 해주는 것이다.(개념의 경량도 : 프로세스 > 쓰레드> 코루틴 동시성 프로그래밍)
코루틴은 thread 키워드와 Thread.sleep 을 대신해준다. 일반적으로 생각할수 있는 thread 개념은 GlobalScope.launch 로, Thread.sleep(일정시간을 작업을 홀딩하는 개념) 은 delay 키워드로 대신할 수 있다.
The basic keywords of coroutine : launch & async
하나씩 확장해나가자.
경량으로 동시성 프로그래밍을 위해서 코틀린에서는 coroutine 의 launch 키워드를 사용할 수 있다. 그리고 delay 키워드는 thread.sleep 처럼 사용할 수 있다. 하지만 딜레이 키워드는 쓰레드를 차단(blocking)하지 않고 코루틴 자체를 기다리게(suspend) 한다. 해당되는 쓰레드는 코루틴이 기다리는 동안 쓰레드 풀로 돌아가게 되고 코루틴의 대기가 끝나면 그 코루틴은 쓰레드 풀 내에서 다시 자유롭게 사용가능한 쓰레드로 분류되게 된다.
이렇게 블로킹을 하지않는, coroutine 의 non-blocking 키워드를 사용하기 위해서는 코루틴 블록에서 사용해야하고 그렇지 않는경우 아래와 같이 컴파일 에러가 난다.
₩Suspend functions are only allowed to be called from a coroutine or another suspend function₩
만약 딜레이 키워드를 직접 사용하고싶다면 ₩runblocking{}₩ 으로 wrapping 해서 사용해야한다.
launch 와 아주 동일하지만 실행후에 반환값이 있는 키워드가 async 키워드. async 키워드의 정의를 보면 deferred<T> 오브젝트를 리턴해주고있다.
Summary : 기존에 thread 를 통해서 구현했던 동시성 프로그래밍은 coroutine 을 통해서 구현할수 있고, 전역 환경에서 실행하는 쓰레드는 launch 키워드, 기존 쓰레드를 대기시키는 기능은 delay로 구현이 가능하다. 단 coroutine 의 키워드들은 suspend 로 선언되는 함수로 구현되어있기 때문에(혹은 구현해야하기 때문에) 일반적인 스콥에서는 사용할 수 없고 만약 사용하고 싶은경우 runBlocking 구문으로 감싸서 사용해야한다. runBlocking 키워드를 통해서 새로운 corotineScope 을 정의하는 셈인 것이다.(참고 : Kotlin – coroutineScope Builder)