[iOS] GCD (3) - Serial(직렬) Queue vs Concurrent(동시) Queue

전성훈·2023년 10월 31일
0

iOS/Concurrency

목록 보기
3/11
post-thumbnail

주제: DispatchQueue Serial, Concurrent 의 차이


Serial Queue

  • (보통 메인에서) 분산처리 시킨 작업을 "다른 한개의 쓰레드에서" 처리하는 큐
  • 순서가 중요한 작업을 처리할 때 사용한다.
// Serial(직렬)
let serialQueue = DispatchQueue(label: "serialQueue")

serialQueue.async {
    for i in 0..<3 {
        print("serialQueue: \(i)")
    }
}

serialQueue.async {
    for i in 3..<6 {
        print("serialQueue: \(i)")
    }
}
  • 위 코드는 DispatchQueue를 사용하여 Serial(직렬) 방식으로 작업을 처리하는 코드이다. serialQueue라는 이름을 가진 DispatchQueue를 생성하고, 두 개의 클로저를 async 메소드로 실행시키면, 첫 번째 클로저가 모두 실행된 후에 두 번째 클로저가 실행된다. 따라서 결과는 다음과 같다.
serialQueue: 0
serialQueue: 1
serialQueue: 2
serialQueue: 3
serialQueue: 4
serialQueue: 5

Concurrency Queue

  • (보통 메인에서) 분산처리 시킨 작업을 "다른 여러개의 쓰레드에서" 처리하는 큐
  • 각자 독립적이지만 (중요도나 작업의 성격 등) 유사한 여러 개의 작업을 처리할 때 사용
// Concurrency(동시)
let concurrentQueue = DispatchQueue(label: "concurrentQueue", attributes: .concurrent)

concurrentQueue.async {
    for i in 0..<3 {
        print("concurrentQueue 1: \(i)")
    }
}

concurrentQueue.async {
    for i in 3..<6 {
        print("concurrentQueue 2: \(i)")
    }
}
  • 위 코드는 DispatchQueue를 사용하여 Concurrency(동시) 방식으로 작업을 처리하는 코드이다. concurrentQueue라는 이름을 가진 DispatchQueue를 생성하고, 두 개의 클로저를 async 메소드로 실행시키면, 두 개의 클로저가 동시에 실행된다. 따라서 결과는 다음과 같다.
concurrentQueue 1: 0
concurrentQueue 1: 1
concurrentQueue 2: 3
concurrentQueue 2: 4
concurrentQueue 1: 2
concurrentQueue 2: 5
  • 위 결과를 보면, 첫 번째 클로저와 두 번째 클로저가 번갈아가면서 실행되고 있는 것을 볼 수 있는데, 이는 Concurrency(동시) 방식에서 여러 작업이 동시에 실행되기 때문이다.

Asynchronous는 Concurrent가 아니다.

  • 비동기적이라고해서 동시성이라는 것은 아니다.
  • 동기적인지 비동기적인지 확인하는 여부는 작업을 실행하는 큐가 작업이 완료될 때까지 기다려야 다음 작업을 생성할 수 있는지 여부를 결정하는 것이고,
  • Concurrent(동시성)으로 분류하는 것은 큐가 단일 스레드를 사용할 수 있는지 여부를 나타낸다. 생각해보면, Serial Queue에 세 개의 비동기 작업을 제출한다는 것은 하나의 스레드만 사용 가능하기 때문에 각 작업이 완전히 끝나기 전에 다음 작업이 시작될 수 없다는 것을 의미한다.

출처(참고문헌)

제가 학습한 내용을 요약하여 정리한 것입니다. 내용에 오류가 있을 수 있으며, 어떠한 피드백도 감사히 받겠습니다.

감사합니다.

0개의 댓글