깨알 개념/Kotlin

[Kotlin] Coroutines - Suspend vs Block

interfacer_han 2024. 2. 9. 12:35

#1 이전 글

[Kotlin] Coroutines - 동기 코드, 비동기 코드

#1 동기 코드 vs 비동기 코드 #1-1 구분하기 코루틴을 제대로 사용하기 위해선 먼저, '동기 코드'와 '비동기 코드(= 코루틴 코드)'를 명확하게 구분할 줄 알아야 한다. 둘을 구분하는 기준은 쉽게 말

kenel.tistory.com

이전 글에서 다룬 Suspend라는 개념은, "스레드를 Block한다"라고 말할 때의 Block과 비슷하면서도 다른 개념이다. 둘의 공통점과 차이점을 짚어본다.
 

#2 Suspend vs Block

#2-1 공통점

둘 다 스레드의 동작을 멈춘다. 하지만, 이 '멈춤'이라는 것은 2가지 양상을 띄며, 서로 구분된다.
 

#2-2 차이점

비유를 통해 설명하겠다.

어떤 재미있는 동영상이 재생되고 있는 상황이다.

1. 녹화나 인코딩을 잘못한 것인지, 분명히 '재생 중' 상태인데 동영상에서 정지 화면이 계속된다.
2. 동영상 플레이어의 '일시 정지' 버튼을 눌러 동영상을 멈춘다.

1번과 2번 어느 쪽이든 동영상이 멈춰 있다는 것은 같다. 하지만, 그 양상은 다르다. Suspend와 Block는 각각 1번과 2번으로 비유될 수 있다. Suspend는 코드 자체에서 '멈춤'을 수행한다. 반면, Block은 스레드를 잠가버려 코드의 의사와는 관계없이 코드의 동작을 제한한다 (물론, Block 또한 코드로 하는 것이긴 하다). 즉 전자는 주체적으로 기다리고, 후자는 외부적 명령으로 인해 코드가 얼어버린다.
 

이미지 출처: https://blog.naver.com/dr_goblin/222257456439

#2-1의 비유를 한번 더 적용해보자면, Suspend는 방송 대기 화면과 같다. 방송 준비가 완료될 때까지 기다리기 때문이다. (이는 동영상 플레이어에서 '일시 중지' 버튼을 누르는 Block과는 분명히 다르다.)
 

#3 Block은 동기 코드, Suspend는 비동기 코드

Block은 스레드를 얼렸다 녹일 뿐, 그 목적이 병렬 구조 구현이 아니다. 반면, Suspend는 병렬 구조 구현을 위해 사용한다. 따라서 Suspend하는 작업이 있다면 그 코드는 비동기 코드라고 봐도 무리가 없다.
 

#4 요약

Suspend는 멈춘다기보단, 기다린다. 정말 멈추는 것은 Block이다.