들어가기 전에
코루틴을 생성할 때 사용되는 문맥에대해 좀 더 생각해봅시다.
핵심 키워드
- 코루틴 문맥
학습하기
들어가기 전에
코루틴을 생성할 때 사용되는 문맥에대해 좀 더 생각해봅시다.
핵심 키워드
학습하기
MainScope
MainScope
는 UI 컴포넌트를 위한 스코프입니다. MainScope
는 SupervisorJob
을 생성하고 이 스코프에서 만들어진 모든 코루틴을 Main
스레드에서 실행합니다. SupervisorJob
을 생성하기 때문에 하나의 코루틴이 예외를 던지면서 실패해도 다른 코루틴들은 취소되지 않습니다.
자식 코루틴의 실패는 CoroutineExceptionHandler를 사용하여 처리 할 수 있습니다.
CoroutineScope(context)
CoroutineScope(context) 함수는 제공된 코루틴 문맥에서 새로운 코루틴 스코프를 생성합니다.
블로킹 모드의 실행
runBlocking
은 새로운 코루틴을 시작하고 코루틴이 완료될 때까지 현재 스레드를 차단합니다. 일시 중단 및 논블록킹 스타일로 작성된 일반 블록 코드와 라이브러리를 연결하도록 설계되었습니다.
코루틴의 문맥들
기본 문맥
Dispatchers.Default는 기본 문맥인 CommonPool에서 실행되기 때문에 새로운 스레드를 생성하지 않고 기존에 있는 것을 이용합니다. 그러므로 연산 중심의 코드에 적합합니다.
I/O를 위한 문맥
Dispatchers.IO는 입출력에 적합한 공유 풀로써, 볼로킹 동작이 많은 파일 or 소켓 I/O 처리에 사용하면 좋습니다.
Unconfined 문맥
비한정 문맥에서 실행된 코루틴은 첫번째 중단점을 만날때까지만 호출자 스레드에서 실행됩니다. 중단점 이후에 재개 되었을때는 서스펜드 함수가 실행된 스레드에서 수행됩니다. 그렇기 때문에 비한정 문맥은 예측 불능한 상태로 수행되기 때문에 해당 기능을 사용하는 것은 권장되지 않습니다.
새 스레드를 생성하는 문맥
newSingleThreadContext는 새로운 스레드가 생성되기 때문에 비용이 많이 들고 더 이상 필요하지 않으면 해제하거나 종료시켜야 합니다. 부모 코루틴이 취소되는 경우 자식 코루틴도 재귀적으로 취소됩니다.
따라서 필요한 경우 join()함수를 사용하여 명시적으로 처리를 기다리도록 만들 수 있습니다.
문맥 바꾸기 - withContext(context)
withContext(context)
: 현재 코 루틴의 컨텍스트를 전환합니다. 주어진 블록이 실행될 때 코 루틴은 이전 컨텍스트로 다시 전환됩니다.
http://www.yes24.com
comment
항상 잘 보고있습니다! 다른건 다 이해가 가도 코루틴은 C++로 락, 언락을 배운 경험이 짧은 제겐 생소한 경험이었어서... 코루틴 강좌를 들으며 굉장한 도움을 받고 있습니다. 근데 20분즈음에 withTimeoutOrNull은 도중에 시간이 다 되면 코루틴 블록이 취소되면서 마지막에 null이 반환된다고 설명하셨고 직접 코드를 짜서 확인했습니다.
슬라이드에서 "Done" 문자열을 반환한다는 설명은 정정해야하지 않나요?
항상 감사드립니다!