iOS Swift/iOS Swift - 기초

[iOS/Swift] Async Sync 비동기 동기 처리 개념 예제

주니어코더 2023. 5. 20. 16:59

 

 

 

 

 

Swift 언어를 사용하여

동기(Synchronous)비동기(Asynchronous) 이해 🔥

 

예제를 통해 알아보자!

 

 

 

 

 

 

 

대용량 처리를 할 때 스레드는 어떻게 될까?


 

네트워크 통신 혹은 대용량 파일 처리하는 스레드의 경우 오랫동안 점유된다

그러면 다른 작업들은 어떻게 실행될까??

 

 

 

이 상황을 예로 들면,

 

나는 빵공장에서 일하게 되었다 🥲

빵공장에는 기계 A,B,C 3개가 있다

 

옆에 초등학교에서 단체 주문이 들어와 빵 900개를 만들어야 한다

 

동기(Sync)의 경우

-> 기계 A에서 빵900개를 제작하는 동안 B, C를 사용할 수 없다

     A에서 빵900개를 모두 만들면 B 또는 C에서 다른 일을 시작한다

 

비동기(Async)의 경우

->  기계 A,B,C에서 빵 300개씩 나눠서 만든다

 

 

동기는 한번에 한 작업만 수행 가능하다

기계A가 작업이 완료돼야 B, C가 다음 작업을 시작한다

 

비동기는 한번에 여러 작업이 수행 가능하다

작업이 완료되기를 기다리지 않고 다음 작업을 시작한다

 

 

 

 

동기(Sync)와 비동기(Async)의 개념


동기(Sync)

: 동기로 작성한 코드는 한 번에한 가지 작업만 수행

즉, 한 작업이 완료될 때까지 기다린 후 다음 작업을 시작합니다.

 

But, 작업이 오래 걸릴 경우 프로그램이 일시중지 될 수 있다🚫

 

 

비동기(Async)

: 비동기로 작성한 코드는 여러 가지 작업을 동시에 수행할 수 있습니다.

한 작업이 완료되기를 기다리지 않고 다음 작업을 시작할 수 있다.

 

But, 코드의 실행 순서를 추적하기 어렵게 만들 수 있다❗️

 

 

 

 

동기(Sync) VS 비동기(Async)


동기(Synchronous) 

동기 프로그래밍은 작업을 순차적으로 진행한다!

작업 A가 시작되면 완료될 때까지 기다린 후, 작업 B를 시작한다 

⭕️ 장점 

  • 코드 한 번에 하나의 작업을 수행하여 코드의 실행 순서가 예측 가능하다
  • 작업의 상태를 쉽게 추적 가능하다

❌ 단점

  • 긴 시간이 걸리는 작업을 처리하는 동안 프로그램이 일시 중단될 수 있다

 

비동기(Asynchronous) 

비동기 프로그래밍은 작업을 동시에 실행하고 결과를 기다리지 않고 다음 작업을 진행한다!

작업 A가 시작되면 결과를 기다리지 않고, 작업 B를 실행할 수 있다

⭕️ 장점 

  • 긴 시간이 걸리는 작업이 있는 경우, 동시에 다른 작업을 처리할 수 있다
  • 프로그램이 더 효율적으로 동작한다

❌ 단점

  • 작업 순서가 일정하지 않아 코드의 실행 순서를 추적하기 어렵다
  • 작업 간의 상태 및 종속성을 관리해야 할 수 있다

 

 

 

동기, 비동기 둘 중 어떤 것을 사용해야 할까? 🤔


어떤 상황에 어떤 것을 써야 하는지?

- 정해진 답은 없다. 상황에 따라 다르다

 

 

동기(Synchronous) 

- 작업 결과가 다음작업에 바로 필요하거나, 코드의 실행 흐름이 일관성을 유지해야 할 때 유용하다!

 

ex) 파일을 읽고 그 내용을 처리하는 작업 - 파일 읽기 작업이 완료된 후에 처리해야 한다

 

 

비동기(Asynchronous) 

- 작업 순서가 중요하지 않거나, 작업이 오랜 시간 걸리는 경우에 유용하다!

 

ex) 네트워크 요청, 파일 다운로드, 애니메이션 - 작업을 동시에 처리하고 응답 대기 시간을 최소화

 

 

 

 

 

Swift 예제 - Async, Sync 동기 비동기 사용 방법


 

DispatchQueue 사용한 비동기(Async) 방법

// DispatchQueue 사용한 비동기 처리
DispatchQueue.global.async {

}

해석: DispatchQueue 를 통해 global 큐비동기 처리 작업을 한다

 

 

코드를 통해 비동기 동기 비교해보자!

 

import Foundation

func synchronousTask() {
    print("Synchronous Task 1")
    sleep(2)  // 2초 동안 대기
    print("Synchronous Task 2")
}

func asynchronousTask() {
    DispatchQueue.global().async {
        print("Asynchronous Task 1")
        sleep(2)  // 2초 동안 대기
        print("Asynchronous Task 2")
    }
}

print("=== Synchronous Task Start ===")
synchronousTask()
print("=== Synchronous Task End ===")

print("=== Asynchronous Task Start ===")
asynchronousTask()
print("=== Asynchronous Task End ===")

 

위의 코드를 실행하면, 동기 작업의 경우 synchronousTask() 함수가 완전히 끝난 후에 다음 라인의 코드를 실행한다

 

🔴 synchronousTask() 결과 

 

Synchronous Task Start   Synchronous Task 1   (2초 대기)   Synchronous Task 2   Synchronous Task End 

 

 

 

반면, 비동기 작업의 경우 asynchronousTask() 함수는 별도의 스레드에서 실행되기 때문에, 메인스레드는 함수의 작업 완료를 기다리지 않고 다음 라인의 코드를 실행한다

 

🔴 asynchronousTask() 결과 

Asynchronous Task Start   Asynchronous Task End   Asynchronous Task 1   (2초 대기)   Synchronous Task 2 

 

 

 

 

 

 

 

 

반응형