Kotlin lang

[kotlin] 코틀린 코루틴에 대한 개념 정리 (2)

Razelo 2024. 4. 21. 21:13

지난번 포스트에 이어 코틀린 코루틴에 대한 개념 정리를 이어가고자 한다. 

 

코루틴에는 CoroutineStart.LAZY를 사용한 코루틴 지연이라는 개념이 있다. 

 

왜 코루틴을 지연해야할까? 

코루틴을 CoroutineDispatcher의 큐에 제출했다고해서, 곧장 코루틴을 특정 스레드에 할당해서 바로 실행해선 안될때 필요하기 때문이다. 그저 실행해야할 코루틴을 미리 만들어두고 나중에 실행시키는 것이다. 

이 경우 launch의 start인자로 CoroutineStart.LAZY를 주어 제출하면 된다. 

그리고 이후에 실행시킬 필가 있을때 start시키면 된다. 

 

지연하고 나서 이후 시작할 수 있는 방법은 launch 코루틴 빌더함수를 통해 받은 Job객체를 사용하면 된다. 

Job객체는 코루틴을 실행시킬 수 있는 start()함수를 제공하고, 동시에 취소시킬 수도 있는 cancel()함수도 제공한다. 

CoroutineStart.LAZY를 launch의 start옵션으로 제공한 뒤 해당 Job 객체를 start()혹은 cancel()하면 되는 것이다. 

 

cancel()의 경우는 특정 상황에서 취소해야할 필요가 있기 때문에 필요하다. 

그런데 여기서 재밌는건 우리가 취소를 하려고 cancel()을 호출해도 그 즉시 코루틴이 취소되는 것이 아니라는 것이다. 코루틴 내에는 취소 플래그가 있는데, 취소 요청 시 이 플래그만 true가 된다.

그리고 실제 취소는 코루틴이 일시정지할 경우 이 플래그를 보고 취소하게 된다는 것이다. 즉 일시정지하는 순간이 없다면 취소가 되지 않는다는 뜻이다. 

따라서 구현할 때 CoroutineScope.isActive를 통해서 지금 코루틴의 상태를 확인하는 로직을 넣어두는 것도 좋은 방법이다. delay(), yield()를 사용해서 일시정지하게 하는 방법도 있다고 하지만 코루틴 내에서 잘못사용하면 성능에 악영향을 줄 수 있다. 

 

취소요청을 하자마자 취소가 되진 않기 때문에 취소된 다음 실행할 코루틴을 선언하고 싶다면 먼저 취소할 코루틴에게cancelAndJoin()을 사용해야한다. 이걸 사용하면 해당 코루틴이 취소되기전까지 호출부의 코루틴이 일시정지된다. 그리고 취소가 완료되면 이후 작업이 진행되는 것이다. 왜냐면 아까도 말했듯이 취소요청했다고 해서 바로 취소되지 않기 때문에 cancelAndJoin()으로 취소가 완료되었음을 보장받겠다는 뜻이다. 

 

또한 코루틴에는 상태라는 개념이 있다. 

코루틴이 어떤 상태인지를 나타내는 상태값이다. 

생성, 실행 중, 실행 완료 중, 실행 완료, 취소 중, 취소 완료라는 단계가 있다. 

참고로 코루틴을 보면서 해당 상태를 머릿속에 떠올리는 것이 도움이 많이 된다고 한다. 

반응형