본문 바로가기
모바일앱/iOS

serial(직렬)과 Concurrent(동시)

by GeekCode 2022. 1. 17.
반응형

저번시간에 queue.async { task } 또는 queue.sync { task } 를 통해 task를 queue로 보냈다

그리고 쌓여 있는 task 들을 다른 스레드로 보내야하는데 GCD 혹은 Operation의 선택은 어떻게 될까

1. 한개의 스레드에 몰아 넣는다
2. 여러개의 스레드에 나눈다

뭐 둘 다 가능 이때, 둘 중 어떤 방식을 선택할건지queue  특성에 따라 결정된다

Serial queue

(보통 메인 스레드에서) 분산 처리 시킨 작업을 “다른 한개의 스레드에서” 처리하는 큐

Concurrent Queue

(보통 메인 스레드에서) 분산 처리 시킨 작업을 “다른 여러개의 스레드에서” 처리하는 큐

어떤 큐를 사용할 것인지에 대한 핵심 포인트는 바로 작업 순서의 중요도에 있습니다.

Serial 큐에 담긴 작업들은 오직 하나의 스레드에만 분배됩니다. 모든 작업들이 그 전 작업이 끝나길 기다렸다가 하나씩 실행 되기 때문에 task의 시작과 종료에 대한 순서 예측이 가능합니다.

반면 Concurrent 큐에 담긴 작업들은 여러개의 스레드로 분배됩니다. 선입선출이라는 Queue의 특성상 작업들이 순서대로 분배되어 실행되긴 하겠지만, 그것들이 끝나는 순서는 알 수 없습니다.

예를 들어 각 cell에서 이미지를 로드해야한다고 할때, 어떤 데이터가 먼저 들어와야 할지 순서는 중요하지 않습니다. 그냥 빠르면 좋은거예요! 이런 상황에서는 Concurrent Queue 를 사용합니다.

하지만 반대로, 순서가 중요한 작업들을 처리해야 한다면 늦게 들어온 것이 먼저 끝나는 상황 등의 방지를 위해 Serial Queue를 써야겠죠?



정리!!

async vs sync

작업을 보내는 시점에서 기다릴지 말지에 대해 다루는 것

concurrent vs serial

Queue(대기열)로 보내진 작업들을 여러개의 스레드로 보낼 것인지 한개의 스레드로 보낼 것인지에 대해 다루는 것

4가지의 조합

SerialQueue.sync

메인 스레드의 작업 흐름이 queue에 넘긴 태스크가 끝날때까지 멈춰있고(sync), 넘겨진 task는 queue에 먼저 담겨있던 작업들과 같은 스레드에 보내지기 때문에 해당 작업들이 모두 끝나야 실행 (Serial Queue)

ConcurrentQueue.sync

메인 스레드의 작업 흐름이 queue에 넘긴 태스크가 끝날때까지 멈춰있고(sync), 넘겨진 task는 queue에 먼저 담겨있던 작업들과 다른 스레드에 보내질 수 있기 때문에 해당 작업들이 모두 끝나지 않아도 실행 (Concurrent Queue)

SerialQueue.async

메인 스레드의 작업 흐름이 태스크를 queue에 넘기자마자 반환되고 (async), 넘겨진 task는 queue에 먼저 담겨있던 작업들과 같은 스레드에 보내지기 때문에 해당 작업들이 모두 끝나야 실행 (Serial Queue)

ConcurrentQueue.async

메인 스레드의 작업 흐름이 태스크를 queue에 넘기자마자 반환되고 (async), 넘겨진 task는 queue에 먼저 담겨있던 작업들과 다른 스레드에 보내질 수 있기 때문에 해당 작업들이 모두 끝나지 않아도 실행 (Concurrent Queue)

반응형

'모바일앱 > iOS' 카테고리의 다른 글

App의 생명주기  (0) 2022.02.22
Progress Bar(2)  (0) 2022.02.17
Progress Bar  (0) 2022.02.16
xib의 이름으로 화면전환하기 (present)  (0) 2022.02.14
Operation  (0) 2022.01.15
Dispatch  (0) 2022.01.14
링크에 한글이 있는 경우  (0) 2022.01.13
로그아웃구현 - push와 present 그리고 NotificationCenter, View의 생명주기  (0) 2022.01.12