이전에 GCD와 동기와 비동기가 무엇인지 간략하게 알아보았다. 이번에는 마지막으로 DispatchQueue의 종류를 알아보고, Serial Queue와 Concurrent Queue에 대해 알아보려고 한다.
우리가 DispatchQueue라는 코드를 통해 Queue라는 곳으로 작업들을 보낸다. 이 Queue에는 두 가지 종류가 있다. 바로 Serial Queue와 Concurrent Queue가 이에 해당한다.
먼저 Serial Queue를 알아보자. 우리가 알고 있는 DispatchQueue.main 이 여기에 해당한다! mainQueue는 main스레드로만 작업을 보낸다는 특징이 있다.
위 사진은 GCD를 통해서 DispatchQueue로 보내진 작업 목록들이다. 작업들을 Queue로 보내지면 Serial Queue는 다음과 같이 처리된다.
위의 사진과 같이 Queue에 있는 작업 목록들이 차.례.대.로 스레드2 라는 하나의 스레드로 작업이 수행되는 것을 볼 수 있다. 즉
💡 Serial Queue는 Queue의 작업 목록들이 오직 하나의 스레드로만 전달되어 작업을 수행하는 Queue이다.
그렇다면 Concurrent Queue는 무엇일까? 우리가 알고 있는 DispatchQueue.global() 이 여기에 해당한다. Global Queue에는 QoS라는 우선순위를 가지는 6 종류가 있다.
우리가 작업들을 DispatchQueue를 이용하여 Concurrent Queue로 보내주면 당연하게 Queue에 작업목록들이 쌓이게 된다. 위의 사진과 같이 [task 1]이 스레드2에 가서 처리되는 것은 Serial Queue와 동일하지만!
Queue에 남아있는 작업들이 여.러.스.레.드 로 옮겨가서 작업이 동시에 진행되는 것을 알 수 있다 ! 물론 여기서 어떤 스레드로 분산할지는 GCD가 알아서 결정하기 때문에 우리가 상관하지 않아도 된다. 즉
💡 Concurrent Queue는 Queue에 있는 작업들이 여러 스레드로 옮겨가서 동시에 작업이 수행된다.
여기까지만 보면 비동기와 동기에서는 비동기가 많이 쓰이는 것과 같이 Serial과 Concurrent 중에는 Concurrent가 많이 쓰이고 Serial은 덜 쓰일 거라는 느낌적인 느낌이 든다.
Serial Queue는 작업들을 한 개의 스레드로 옮겨가서 작업을 수행하기 때문에 순서가 중요한 작업을 보통 Serial Queue로 처리한다.
반면에 Concurrent Queue는 여러 스레드로 동시에 작업이 수행되어서 보통 순서와 관련 없는 유사한 여러 작업들을 수행할 때 사용한다.
여기까지 알았다면 이제 비동기와 동시(Concurrent Queue)의 혼동이 생길 수도 있다. (내가 그랬다...) 다시 한번 살펴보면 일단 작업이 시작되는 기준을 잘 알아야 한다 !
일단 비동기의 경우에는 작업이 메인스레드 -> 다른 스레드로 옮겨가고 그 작업을 기다리지 않는 것을 말한다.
반면에 Concurrent Queue에서는 DispatchQueue를 통해 Queue에 들어있는 작업 목록들이 여러 개의 스레드로 분산되어 작업을 처리하는 것을 말한다.
이 포스트는 앨런님의 강의에서 발췌했습니다.