ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 동시성 프로그래밍(2) Serial(직렬) VS Concurrency(동시)
    iOS 2022. 2. 4. 14:37

    안녕하세요.

    오늘은 Serial(직렬)과 Concurrency(동시)에 대해서 알아보도록 하겠습니다.

     

    sync/aysnc와 Serial/Concurrency를 헷갈리시는 분들이 계신 걸로 알고 있는데요.

     

    둘은 절대 다릅니다!!

     

    sync/async는 작업에 대한 특성이라면

    Serial/Concurrency는 큐(대기행렬)에 대한 특성입니다.

     

    하나씩 알아보도록 하겠습니다.


    1. Serial(직렬)

    Serial은 순차적인이라는 뜻을 가지고 있습니다.

     

    따라서 Serial Queue는 들어온 작업을 순차적으로 실행시키는 Queue입니다.

     

    코드로 확인해보겠습니다.

     

    우선 Serial Queue를 만들겠습니다.

    attributes 옵션을 주지 않으면 SerialQueue가 생성됩니다.

    let queue = DispatchQueue.init(label: "Serial")

    sync/async 때와 마찬가지로 1초, 2초, 3초를 기다리는 함수를 만들고

    async하게 실행시켜보겠습니다.

    func test1() {
        print(#function,"시작")
        sleep(1)
        print(Thread.current, Thread.isMainThread)
        print(#function,"완료")
    }
    
    func test2() {
        print(#function, "시작")
        sleep(2)
        print(Thread.current, Thread.isMainThread)
        print(#function, "완료")
    }
    
    func test3() {
        print(#function, "시작")
        sleep(3)
        print(Thread.current, Thread.isMainThread)
        print(#function, "완료")
    }
    
    queue.async {
        test1()
    }
    queue.async {
        test2()
    }
    queue.async {
        test3()
    }

    결과를 확인해보겠습니다.

    각각의 작업을 async하게 실행시켰음에도 불구하고

    먼저 시작된 작업이 완료되고 나서야 다음 작업이 시작되는 것을 확인할 수 있습니다.

     

    이렇듯 Serial Queue는 작업을 순차적으로 실행시키기 때문에 한번에 하나의 작업만을 할 수 있습니다.

     

    위의 결과를 통해서 확인할 수 있는 것이 하나 더 있습니다.

     

    3개의 함수가 모두 같은 Thread에서 실행된 것입니다.

     

    작업을 순차적으로 실행시키기 때문에 굳이 여러 Thread에서 실행시킬 이유가 없겠죠?

     

    따라서 Serial Queue는 한 개의 Thread로만 작업을 보내는 Queue라고 볼 수 있습니다.


    2. Concurrency(동시)

    다음은 Concurrency입니다.

    concurrency는 동시 실행이라는 뜻을 가지고 있습니다.

     

    Serial에 반대되는 개념이라고 생각하면 되겠죠??

     

    concurrency는 Queue에 들어온 작업들을 동시에 실행시킵니다.

     

    마찬가지로 코드로 확인해보겠습니다.

     

    Serial을 설명한 코드에서 Queue의 속성만 바꾸겠습니다.

    let queue = DispatchQueue.init(label: "concurreny", attributes: .concurrent)

    attributes의 옵션을 concurrent로 주면 Concurrency Queue를 만들 수 있습니다.

     

    그리고 결과를 확인하면

    각각의 작업들이 동시에 실행된 것을 확인할 수 있습니다.

     

    또한 모두 다른 Thread에서 실행된 것을 확인할 수 있습니다.

     

    Concurrent Queue는 서로 다른 여러 Thread를 사용해서 동시에 여러 개의 작업을 처리합니다.


    오늘은 Serial과 Concurrency에 대해서 알아보았는데요.

     

    언제 Serial Queue를 사용하고 언제 Concurrency Queue를 사용하는지 궁금하실 것 같은데요.

     

    순서가 중요한 작업에는 Serial Queue를 사용해야 합니다.

    대부분의 작업이 순서가 중요하자나요??

    DispathQueue.main도 Serial Queue입니다.

     

    Concurrent Queue의 경우 각각 독립적이지만 비슷한 작업을 처리할 때 사용합니다.

    예를 들어서 TableView나 CollectionView Cell에 이미지를 다운로드하는 경우,

    순서가 중요하지 않자나요.

    빨리 이미지를 다운로드해서 화면에 띄우는 게 중요하지.

    그럴 경우 사용합니다.

     

    Ref

     

    iOS Concurrency(동시성) 프로그래밍, 동기 비동기 처리 그리고 GCD/Operation - 디스패치큐와 오퍼레이션

    동시성(Concurrency)프로그래밍 - iOS프로그래밍에서 필요한 동기, 비동기의 개념 및 그를 확장한 GCD 및 Operation에 관한 모든 내용을 다룹니다., - 강의 소개 | 인프런...

    www.inflearn.com

     

Designed by Tistory.