코루틴은 일시중단 일단 일시중단이 가능하다.
launch 든 async 든 내부에 일시중단을 하는 동작이 있다면 코루틴은 잠시 멈춘다.
코루틴은 일을 협력(?) 한다는 느낌을 내포하고 있는데
여러개의 코루틴이 존재 할 수 있고 어떤 스레드에서 동작할지 명시 해준다면
각각의 코루틴을 잠시 멈췄다가 다른 코루틴을 실행시키고 그리고 일이 마무리되면
다른 코루틴과 같이 결과를 전달하거나 서로 순서를 옮겨다니며
동작한다.
예를 들면
val job3 = CoroutineScope(Dispahchers.IO).async{
//2. IO 스레드에서 작업3을 수행
(1..100).sortedByDescending{it}
//5. 작업3이 완료된다.
}
val job1 = CoroutineScope(Dispahchers.Main).lauch{
//1. Main 스레드에서 작업1을 수행
println(1)
//3. 작업1의 남은 작업을 위해 작업3으로부터 결과값이 필요하기 떄문에 메인 스레드는
//작업 1을 일시중단
val job3Result = job3.await()
//6. 작업 3으로부터 결과를 전달받음
//7. 작업1이 재개된다.
job3Result.forEach{
println(it)
}
//4. Main 스레드에서 작업2가 수행되고 완료된다.
val job2 = CoroutineScope(Dispahchers.Main).lauch{
println("job2 수행완료")
}
}
이렇게 진행된다.
await는 async 의 작업이 완료 될때까지 기다리는 메소드다.
이런 코드를 보면 코루틴이 왜 일시정지가 필요한지에 대해 알게된다.
그럼 원래 이야기 하려고 했던 suspend 는 뭘까?
코루틴 내부에서 진행되는 코드들은 언제나 일시정지가 가능해야하는데 외부함수는
코루틴 외부에 적힌 함수이기 때문에 코루틴 내부에서 쓰일 수 없다.
그래서 그것을 가능하게 해주기 위해서
코루틴 외부에 적힌 함수가 코루틴 내부에 쓰일때 일시중단 될 수 있는 함수라는걸 명시해주는것이다.
여기서 좀 더 자세히 동작 방식을 알아보면
Suspend - 모든 Local 변수를 저장하고, 현 Scope 에서의 코루틴의 실행을 pause 한다.
Resume - pause 됐던 곳에서 , 코루틴을 계속 실행한다.
이렇게 코루틴에서는 Suspend 를 만났을때 그 시점에서 잠시 일시정지를 하고 Suspend 함수를 실행하고 돌아와서
이어서 실행하게 된다.
반응형
'Android > Coroutine' 카테고리의 다른 글
코루틴에 관한 50가지 질문과 답 - 1 (0) | 2023.07.10 |
---|---|
StateFlow 원시성 보장하기 (1) | 2022.09.19 |
코루틴의 job 과 Deferred 의 차이 (0) | 2022.03.26 |
안드로이드 코루틴 flow의 StateFlow 와 SharedFlow (0) | 2022.03.05 |
Android Coroutine Flow - 2 (실제로 써보기) (0) | 2022.02.11 |
Android Coroutine Flow (0) | 2022.02.11 |