ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 동시성 프로그래밍(1) Sync(동기) VS Async(비동기)
    iOS 2022. 2. 3. 16:57

    안녕하세요.

    오늘은 동기(Sync)와 비동기(Async)에 대해서 알아보도록 하겠습니다.


    1. Sync(동기)

    사실이 동기라는 단어가 잘 안와닿는데요.

     

    사전에 synchronous라는 단어를 검색하면

     동시 발생하는이라는 뜻을 가지고 있는데요.

    이렇게 보면 두 개의 작업이 동시에 발생하는 게 동기 같은 느낌이 듭니다.

    하지만 저희가 작성했던 DispathcQueue.global().sync는 그렇지 않자나요?

     

    프로그래밍에서는 한 작업에 대한 요청과 응답이 동시에 발생하는 것을 동기라고 말합니다.

     

    동시라고 설명하니깐 작업시간이 긴 작업에 대해서는 조금 이해가 되지 않을 수도 있을 것 같아요.

     

    요청을 보낸 작업에 대해서는 응답이 올 때까지 다른 작업을 요청하지 않는다! 라고 생각하시면 될 것 같습니다.

     

    코드로 살펴보겠습니다.

     

    func test1() {
        print(#function,"시작")
        sleep(1)
        print(#function,"완료")
    }
    
    func test2() {
        print(#function, "시작")
        sleep(2)
        print(#function, "완료")
    }
    
    func test3() {
        print(#function, "시작")
        sleep(3)
        print(#function, "완료")
    }
    
    let queue = DispatchQueue.global()
    
    let startTime = Date() // 시작시간
    
    queue.sync {
        test1()
    }
    queue.sync {
        test2()
    }
    queue.sync {
        test3()
    }
    
    let taken = Date().timeIntervalSince(startTime) // 소요시간
    
    print("소요시간:",taken)

    1초, 2초, 3초를 대기하는 함수를 작성하고

    글로벌 큐에서 동기적으로 실행시킨 후에 결과를 살펴보겠습니다.

    함수들이 큐에 들어간 순서대로 실행되는 것을 확인할 수 있고 총 소요시간은 6초가 나오는 것을 확인할 수 있습니다.

     

    위의 그림과 같이 작업이 끝날 때까지 기다린 후 다음 작업을 요청하는 것입니다.

     

    그리고 각각의 함수에

    print(Thread.current, Thread.isMainThread)

    다음과 같은 코드를 추가해 어떤 쓰레드에서 실행되는지 확인해보겠습니다.

    글로벌 큐에서 작업을 실행시켰음에도 불구하고 모두 메인 쓰레드에서 실행되는 것을 확인할 수 있습니다.

    요청한 작업이 끝날때까지 기다려야하므로 다른 쓰레드에서 실행시키든 메인쓰레드에서 실행시키든 상관이 없기 때문입니다.


    2. Async(비동기)

    그렇다면 비동기는 무엇이냐

    동기와 반대로 동시에 발생하지 않는 것을 의미하는데요.

     

    한 작업에 대해서 요청과 응답이 동시에 발생하지 않는 것을 의미하겠지요? 

     

    마찬가지로 코드를 통해 살펴보겠습니다.

    func test1() {
        print(#function,"시작")
        sleep(1)
        print(#function,"완료")
    }
    
    func test2() {
        print(#function, "시작")
        sleep(2)
        print(#function, "완료")
    }
    
    func test3() {
        print(#function, "시작")
        sleep(3)
        print(#function, "완료")
    }
    
    let queue = DispatchQueue.global()
    
    let startTime = Date()
    
    queue.async {
        test1()
    }
    queue.async {
        test2()
    }
    queue.async {
        test3()
    }
    
    let taken = Date().timeIntervalSince(startTime)
    
    print("소요시간:",taken)

    동기를 설명할 때 작성했던 코드와 똑같지만

    함수를 sync가 아닌 async로 비동기적으로 실행되게 수정했습니다.

    소요시간이 0.0009초가 나온것을 확인할 수 있습니다.

    작업이 끝날 때가지 기다리지 않고 즉시 반환한 것입니다.

     

    또한 쓰레드를 확인해보았을 때도 3개의 함수가 모두 다른 쓰레드에서 실행된 것을 확인할 수 있습니다.

     

    이러한 과정을 그림을 통해 살펴보면

    이러한 느낌인 것입니다.


     

    이번 시간에는 동기와 비동기에 대해서 알아봤는데요.

    동기는 요청받은 작업이 끝날 때까지 기다린다.

    비동기는 요청받은 작업이 끝날 때까지 기다리지 않는다. 즉시 반환한다.

    라고 생각하면 될 것 같습니다.

     

    Ref

     

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

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

    www.inflearn.com

     

Designed by Tistory.