본문 바로가기

코틀린

Coroutine2

코루틴에 관해서는 공부해야할게 꽤 많은 것 같아서 공부내용이 추가되는대로 계속 글을 쓰고 나중에 한번에 몰아서 정리를 해야겠다.

 

코루틴은 경량 쓰레드라고도 불림. 그 이유는?
-> 쓰레드당 하나의 명령만 실행된다. 쓰레드 보다 생성비용이 가볍고 빠르다. 근데 코루틴이 contextSwithing 을 계속 해서 상황에 따라서는 쓰는게 오히려 손해일수도 있다.
 
코루틴을 만드는 방법은 세가지가 있다.
1. CoroutineScope.async() 를 활용하는 방법
-코루틴 내에서 예외가 발생할 수 있기 때문에 이 메소드는 Deffered 를 리턴한다. 리턴값이 존재한다.
 
2.CoroutineScope.launch() 를 활용하는 방법
-결과를 반환하지 않고 실행하거나 취소할 수 있는 객체인 Job을 리턴해준다.
 
Dispatcher가 어떤 개념임?
-dispatch 는 '보내다' 라는 뜻을 가진다. 이게 뭘 의미하냐면 dispatcher가 스레드 풀에 있는 스레드중에서 코루틴을 분배할 수 있는 녀석을 찾아내서 주는 것을 의미한다. 그게 dispatcher의 역할이다.
세가지 종류가 있는데..
Dispatcher 는 코루틴이 동작하는 방식하고 연관이 있는 것이 아닌 Task 에 대한 분배에 대한 책임만 있습니다.
 
Dispatcher.Main
-안드로이드에서 쓰는 디스패처다. 안드로이드에서는 ui관련 작업을 메인 스레드에서만 해야 한다. ui와 상호작용하는 작업을 실행하기 위해서만 사용해야한다.
 
-디스크 또는 네트워크의 I/O작업을 실행하는데 쓰는 디스패치
 
-CoroutineScope는 인터페이스이다.
-Dispatcher 는 구현체이다.
 
코루틴에서 job 이 무엇을 의미하는가?
A background job. Conceptually, a job is a cancellable thing with a life-cycle that culminates in its completion.
백그라운드 작업이다. 개념적으로, job은 취소가 가능하고 job은 생명주기상 completion 됐을때 끝이난다.
(백그라운드 작업이란, 취소가 가능하며 시작부터 완료까지 일련의 과정을 거치는 작업을 말합니다.)
공식문서 中
내 생각 : 말 그대로 백그라운드 작업이다. 뭐. . 이게 서버에서 데이터를 받아오는 작업이 될 수 있고 로컬DB에 있는 데이터를 갖고오는 작업이 될수도 있다. 아마 인터넷의 수많은 예제들을 보면 n초 뒤에 로그를 출력하는 식으로 설명하는데 그것도 하나의 작업이다.
-코루틴은 전부 각자 하나의 job객체를 가진다.
-job객체의 join() 메소드를 사용해서 자식 코루틴이 끝날때까지 명시적으로 기다릴 수 있다.
join : Suspends the coroutine until this job is complete.
(이 작업이 완료될때까지 코루틴을 일시정지한다.)
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
// 부모 코루틴 runBlocking
fun main() = runBlocking{
    
    // 자식 코루틴 job1
    val job1 = launch {
        delay(100)
        println("Test1")
    }
    // 자식 코루틴 job2
    val job2 = launch {
        delay(200)
        println("Test2")
    }
    job1.join()
    job2.join()
    println("All tests are done")
}

부모 자식 코루틴 사이에서의 관계
  • 자식은 부모 컨텍스트를 상속받는다.
  • 부모는 모든 자식들이 종료될때까지 일시중지 된다.
  • 부모가 cancel되면 모든 자식들도 cancel된다.
  • 자식이 destroy되면 부모 또한 destroy된다.
코루틴에서 job의 생명주기
job은 cancel 가능하다. 아래와 같은 생명주기로 나타낼 수 있다.

(혼돈하지 말자 위의 사진을 더욱 자세하게 표현한게 아래의 사진이다.)
Active
-job이 필요한 작업을 시작한다.
-job이 코루틴 빌더에 의해서 생성 될때, 코루틴이 Activie 상태로 실행된다.
-대부분의 코루틴이 Active 상태에서 시작한다고 한다. 지연 시작된 코루틴은 new상태에서 시작하고 Active로 변한다.
-job이 인터럽트 되지 않고(아마도 Exception을 얘기하는 것 같다.)실행이 완료되면 Comleting으로 된다.
자식 코루틴이 완료되기를 기다린다.
-자식 코루틴도 완료되면 completed가 되고 종.
-Active나 Completing 도중에 cancel이나 실패하면 상태는 Cancelling 으로 변한다.
-Canclling 상태에서는 DB와 연결을 끊거나 리소스 해제 작업을 한다.
-Canclling 에서 필요한 작업을 모두 끝내고 나면 Canclled로 된다.
 
 
코루틴에 대한 기본 개념 정리글.
 
Dispathcer 에 관해서 잘 정리한 글
 
job에 관해서 잘 정리된글
https://icarus8050.tistory.com/149-부모 job이 종료되면 하위 자식 job들은 전부 종료된다.
-자식 job에서 exception 이 발생하면 부모에게 전달된다.