본문 바로가기
iOS📱/Common

[ iOS ] GCD 3편 - Serial vs Concurrent

by 텅빈비니 2023. 1. 18.
반응형

안녕하세요 🐶
빈 지식 채우기의 비니🙋🏻‍♂️ 입니다.

오늘은 저번에 이어서 GCD 3편! Serial vs Concurrent 관해 알아보는 시간을 가지겠습니다.

 

GCD 2탄이 궁금하신 분들은 먼저 보고 오시면 더욱 이해가 쉬울거라 생각됩니다 ㅎㅎ :)

 

[ iOS ] GCD 2편 - Sync vs Async

안녕하세요 🐶 빈 지식 채우기의 비니🙋🏻‍♂️ 입니다. 오늘은 GCD 2편! Sync vs Async 관해 알아보는 시간을 가지겠습니다. GCD 1탄이 궁금하신 분들은 먼저 보고 오시면 더욱 이해가 쉬울거라 생

beanistory.tistory.com

 

1. 개요

이번 포스팅은 개발자분들이 실제 프로젝트를 진행하면서 진짜 많이 쓰고 찾아보았던 것들에 대해 공부해보려고 합니다.

바로봐로~~~

 

Serial vs Concurrent

 

입니다. 실제로 어떻게 쓰는지에 대해서는 다음 포스팅에 다뤄보고,

오늘도 역시 이론 위주로 설명드리겠슴돠!

 

2. Serial vs Concurrent

이번에는 Sync, Async 를 뒤이어 SerialConcurrent를 다뤄보려고 합니다.

두 개념에 대해서는 엄연히 다른 용어이기 때문에 잘 보아주세요옹~

 

2-1. Serial

먼저, Serial의 사전적 정의는 다음과 같습니다.

형용사를 보면 "순차적인" 이라는 뜻을 볼 수 있습니다.
즉, 순차적으로 작업을 실행한다~ 라고 이해하면 됩니다.

 

오~ 그럼 여기서 질문!?

Sync도 앞 작업이 끝나기 전까지 뒷 작업 실행 못하니까 ...... 아!! Serial이랑 같은 거네 ㅎㅎㅎ

 

응 아니야~ 완전 달라 ~~

 

Sync는 "내 요청에 관한 답을 받을 때까지 기다릴 것이다!

라는 단일작업의 특성을 지녔습니다.

고로 Sync는 앞 작업과 뒷 작업에 대한 연관성이 전혀 없기 때문에 전혀 다른 용어입니당.

 

근데?! 앞 작업과 뒷 작업을 "순차적으로" 실행시킬지 정하는 것이 바로 SerialConcurrent 입니다.

 

그 중, Serial의 경우는 SerialQueue 이런 식으로 사용하게 되는데

대표적으로 Main Queue가 Serial Queue 입니다.

 

고로! Serial은 

내 Queue에 들어온 작업들을 순차적으로 실행시킨다 

의 의미로 해석될 수 있습니다.

 

Serial Queue

위에 그림처럼 Sync의 경우 순차적으로 작업이 실행된다는 것을 알 수 있습니다.

코드 예제로 한번 보시죠!

 

func SyncTest() {
    print("start")	// (1)
    DispatchQueue.main.async {	// (4) > Async
        for _ in 0...10 {
            print("async")
        }
    }
    for _ in 0...10 {	// (2)
        print("sync")
    }
    print("end")	// (3)
}

이 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.

  1. Sync인 "Start" 작업이 먼저 실행된다.
  2. Sync 인 For 구문이 Async For 구문보다 먼저 실행된다.
    • Serial Queue이기 때문에 오직 하나의 작업만 가능하다.
  3. "end" 작업이 실행된다.
  4. 마지막으로 Async 작업이 실행된다.

 

위 일련의 작업들을 그림으로 보면 다음과 같다.

Serial Queue는 보통 작업의 "동기화" 를 할 때 사용합니다.

 

2-2. Concurrent

바로 사전적 정의로 알아보죠.

형용사를 보면 "동시에 발생" 이라는 뜻을 볼 수 있습니다.
즉, 동시다발적으로 작업을 실행한다~ 라고 이해하면 됩니다.

 

Concurrent는 

내 Queue에 들어온 작업들을 동시다발적으로 실행시키겠다.

라는 개념입니다.

 

Concurrent Queue

바로 Concurrent 코드 예제로 넘어가 보겠습니당.

func ConcurrentTest() {
    let concurrent = DispatchQueue.init(label: "SodeulQueue", attributes: .concurrent)	// (1)
    concurrent.sync  { print("start") }	// (2)
    concurrent.async { for _ in 0...5 { print("async") }}	// (3)
    concurrent.sync  { for _ in 0...5 { print("sync") } }	// (4)
    concurrent.sync  { print("end") }	// (5)
}

Concurrent Queue동시다발적인 작업을 실행시킬 수 있기 때문에 

  1. Sync인 "start"가 먼저 실행된다.
  2. 3. 4. 5. 그 다음 두개의 For 구문과 "end" 구문이 동시에 실행된다
    • 왜냐?! Concurrent Queue 이니까 동시다발적인 실행이 가능하다.

 

 

Concurrent Queue는 보통 작업을 동시다발적으로 실행 할 때 사용합니다.

 

2-3. Serial vs Concurrent

 

이상으로 GCD 3편 - Serial vs Concurrent 포스팅을 마치겠습니다.

틀린 부분이나 궁금한 사항은 댓글 남겨주세요~🤭

 


참고

반응형