[240510] TIL
[Today, What I Studied]
오늘은 공부한 내용을 바깥에코루틴에 대해서 처음 배웠고, 상당히 헤맸다.
우선 동기(Synchronous)와 비동기(Asychronous)
비동기적 처리는 multiple tasks to run concurrently(동시 작업을 가능하게!)
동기적 처리는 순차적으로 작업을 진행 -> 이전 작업이 완료되어야 다음 작업 실행
내가 이해한 코루틴
=> 여러 작업들의 동기적 처리를 위해, suspend 함수를 이용한 것. 일시 중단이 가능한 작업의 단위!
코루틴을 사용하기 위해선 suspend 함수, 코루틴 스코프, 코루틴 빌더, 코루틴 Context(Dispatcher)에 대해 알아야 한다.
suspend 함수는 함수 내에 중단점이 존재하여, 다른 작업을 위해 쓰레드를 양보하는 함수.
1 suspend 함수 내, 2 코루틴 스코프 내에서 실행 가능
코루틴 빌더
대표적으로 async()와 launch()
- launch()는 Job을 반환한다.
- async()는 Deferred< T >를 반환한다
[ Job ]
=> 코루틴의 취소 등, 코루틴을 관리하기 위한 객체(상태를 관리하여 라이프사이클을 조작한다)
생성 , 실행, 취소를 기준으로
생성(New)
, 실행 중(Active)
, 실행 완료(Completed)
, 취소 중(Canceling)
, 취소 완료(Canceled)
라는 5가지의 상태를 가진다.
[Deferred]
=> Job의 하나로, 결과( T )를 Deferred로 감싸 반환한다.
-> await()으로 접근하며, 현재 쓰레드를 결과를 반환할 수 있을 때까지 일시중단한다.
둘의 차이는 예외의 노출 여부이다!
둘 다 예외를 전파하지만,
Deferred는 예외를 노출시켜 catch할 수 있다.
코루틴 Context: 코루틴이 실행되는 환경 (plus를 사용하여 context 구성)
- name : unique하게 정의된 코루틴의 이름
- job : 코루틴의 라이프사이클을 조정
- Exception Handler : 코루틴의 코드가 날린 exception을 처리
- Dispatcher : 쓰레드풀에서 사용가능한 쓰레드를 골라, 코루틴을 쓰레드로 보내는 객체, 이미 정의된 4가지의 Dispatcher가 있다.
- Dispatchers.Main - UI와 상호작용하는 작업을 실행
- Dispatchers.IO - 디스크 또는 네트워크 I/O 작업을 실행
- Dispatchers.Default - CPU를 많이 사용하는 작업
< Structured Concurrency >
댓글남기기