2023. 6. 12. 00:58ㆍCoroutine
예제 1
suspend function의 사용이 나왔다. suspend function은 뭘까? 어떻게 작동할까?
정확한 정의를 모르겠다. 코드를 통해 일단 어떻게 작동하는지 알아보자.
먼저 suspend function으로 만든 두 개의 함수가 있다.
각 각 one, two라는 변수로 할당한다. 그리고 실행하면 결과는 아래와 같다.
두 함수의 결과를 더한 값이 나오고 시간은 약 2초가 걸린다.
2초가 걸린다는건 doSomethingUsefulone에서 1초 delay 후 doSomethingUsefultwo에서 1초가 걸린다는 뜻이 된다.
suspend fun 두 개가 실행됐는데 순차적으로 하나씩 실행을 하고 결과를 반환한다는 의미이다.
suspend fuc은 동기적으로 실행한다는 의미? 아직 suspend에 대해 잘 모르겠다
일단 넘어가보자.
예제 2 async await
async와 await가 나왔다. 두 개의 함수는 어떻게 동작할까?
suspend fuc인 두 함수를 async로 감싸서 실행하고 할당된 변수를 await를 사용한다.
결과는 아래와 같다.
두 개의 suspend fun이 비동기적으로 동시에 실행된다. 어떻게 돌아가는 걸까?
먼저 async는 무엇을 반환할까?
async는 Scope에서 새로운 coroutine을 생성하고 context, start, block을 매개변수로 받으며 Deferred를 반환한다.
Deferred는 무엇일까?
Deferred는 Job inferface를 상속받는 interface이다. 그래서 job의 메서드와 4개의 새로운 함수가 있다. 그중에 하나가 await이다.
await가 그래서 어떻게 작동한다고? 위의 예제 2를 다시 보자.
async 안에 println으로 현재 어떤 스레드를 사용하는지 확인해 보자. 결과는 아래와 같다.
코루틴을 각각 생성하고 비동기 실행을 하게 된다.
왜 이렇게 하는 걸까?
답은 당연히 비동기적인 실행들을 동기적으로 보이게 하려고. 애초에 coroutine의 목적은 비동기처리의 dreamcode이다.
readablilty 하고 동작이 깔끔한, callback 지옥에 빠지지 않게 만들기 위함이다. 이걸 잊지 말자.
정리하면 다음과 같다.
1. suspend를 사용하면 함수를 도중에 다른 값을 기다릴 수 있으면서 동기적인 사용이 가능해진다.
2. async를 사용하면 함수를 비동기적으로 사용한다. 그리고 async는 반환값을 가지고 있다.
'Coroutine' 카테고리의 다른 글
coroutine dispatchers, Flow Hot & Cold (0) | 2023.06.13 |
---|---|
coroutine basic (0) | 2023.06.10 |
Coroutine 기본 개념잡기 (0) | 2022.12.27 |