티스토리 뷰

Swift

[Swift] Concurrency 와 GCD

Kim_Baechu 2023. 5. 29. 13:12

Concurrency

Swift Concurrency는 비동기 프로그래밍을 지원하기 위한 도구로, 코드를 간결하고 효율적으로 작성할 수 있게 도와줍니다. 이 기능은 asyncawait 키워드를 사용하여 비동기 작업을 선언하고 처리할 수 있습니다.

Swift Concurrency의 동작 방식에 대해 자세히 알아보면 다음과 같습니다.

  1. Structured Concurrency:
    • Swift Concurrency는 구조적 동시성(Structured Concurrency)을 지원합니다. 이는 비동기 작업 간의 종속성을 명시적으로 관리하여 프로그램의 실행 흐름을 제어하는 방법입니다.
    • async let 구문을 사용하여 여러 비동기 작업을 동시에 실행하고, await를 사용하여 해당 작업들이 완료될 때까지 대기할 수 있습니다.
  2. Actors:
    • Actors는 동시성을 위한 새로운 개념으로 도입되었습니다. Actor는 동시에 실행되는 여러 작업에 안전하게 접근할 수 있는 독립된 단위입니다.
    • Actor는 데이터를 보호하고, 동기화 없이 안전하게 공유 상태를 업데이트할 수 있습니다. Actor 메서드는 자동으로 스레드 안전하게 실행됩니다.
    • actor 키워드를 사용하여 Actor를 정의하고, 다른 코드에서는 해당 Actor의 메서드와 속성에 await를 사용하여 접근할 수 있습니다.
  3. Async/Await:
    • Swift Concurrency에서 가장 중요한 키워드는 asyncawait입니다. async 키워드는 비동기 작업을 선언하는 데 사용되며, await 키워드는 비동기 작업이 완료될 때까지 기다리는 데 사용됩니다.
    • async 키워드로 선언된 함수는 비동기 작업을 반환하고, await 키워드로 해당 작업이 완료될 때까지 기다릴 수 있습니다. 이를 통해 비동기 코드를 동기 코드처럼 작성할 수 있습니다.
  4. Task:
    • Swift Concurrency에서는 Task라는 개념이 도입되었습니다. Task는 비동기 작업의 실행을 나타내는 타입입니다.
    • Task를 사용하여 비동기 작업을 생성하고, 실행 중인 작업을 취소하거나 대기하고 있는 작업을 확인할 수 있습니다.

Swift Concurrency는 비동기 프로그래밍을 더욱 쉽고 직관적으로 만들어줍니다. 구조적 동시성과 Actors를 통해 동시성 버그를 방지하고 안전하게 코드를 작성할 수 있으며, async/await를 사용하여 비동기 작업을 보다 직관적으로 다룰 수 있습니다. 이러한 기능들은 Swift 언어 자체에 통합되어 있어 개발자들이 비동기 코드를 더욱 쉽게 작성하고 관리할 수 있도록 도와줍니다.

GCD와 비교

Swift Concurrency와 GCD는 CPU와 스레드를 다루는 방식에서 차이가 있습니다.

  1. Swift Concurrency:

    • Swift Concurrency는 비동기 작업을 처리하기 위한 언어 수준의 기능입니다.
    • Swift Concurrency는 스레드와 CPU를 직접 다루지 않습니다. 대신, 비동기 작업을 실행하고 관리하기 위해 구조적 동시성(Structured Concurrency)과 Actors를 활용합니다.
    • 구조적 동시성은 비동기 작업 간의 종속성을 명시적으로 관리하고, 작업의 실행을 스케줄링합니다. 이를 통해 코드의 가독성과 유지보수성을 높이고 동시성 버그를 사전에 방지할 수 있습니다.
    • Actors는 안전한 데이터 공유를 보장하고 동시 접근을 관리하기 위한 메커니즘입니다. 각 Actor는 독립된 스레드에서 실행되며, 메시지 전달을 통해 안전하게 데이터를 공유합니다.
  2. GCD (Grand Central Dispatch):

    • GCD는 저수준의 C 기반 API로, 다중 스레딩 및 비동기 작업을 처리하기 위한 기술입니다.
    • GCD는 CPU 코어와 스레드를 활용하여 작업을 처리합니다. CPU 코어는 실제 작업을 실행하는 처리 장치이고, 스레드는 작업의 실행을 담당하는 실행 컨텍스트입니다.
    • GCD는 여러 개의 큐를 사용하여 작업을 스케줄링하고, 각 큐는 하나 이상의 스레드를 가질 수 있습니다. GCD는 작업을 큐에 추가하고, 적절한 스레드에서 해당 작업을 실행합니다. 작업은 FIFO(First-In-First-Out) 방식으로 실행될 수 있습니다.
    • GCD는 시스템 자원을 효율적으로 활용하기 위해 작업의 실행을 동적으로 조절하며, 스레드 풀을 사용하여 스레드를 재사용합니다.

    Swift Concurrency는 CPU와 스레드를 직접 다루지 않고 구조적 동시성과 Actors를 활용하여 비동기 작업을 다룹니다.
    GCD는 CPU와 스레드를 사용하여 다중 스레딩과 비동기 작업을 처리합니다.

GCD 사용 사례:

  • 병렬 처리: 시스템 자원을 효율적으로 활용하여 병렬 처리를 수행해야 할 때, GCD는 큐와 작업 스케줄링 기능을 제공하여 다중 스레드 작업을 관리할 수 있습니다.
    • 저수준 작업 스케줄링: 스레드와 큐를 직접 관리하고 싶거나, 특정 작업을 세밀하게 제어하고자 할 때, GCD는 저수준의 API를 제공하여 작업 스케줄링과 동시성 관리를 자유롭게 할 수 있습니다.
    • 기존 GCD 코드와의 호환성: 기존에 작성된 GCD 코드를 유지하고 있는 경우나, 특정 프레임워크가 GCD를 요구하는 경우에는 GCD를 계속 사용하는 것이 좋습니다.

Swift Concurrency와 GCD는 상호 배타적이지 않습니다.
Swift Concurrency를 사용하면서 GCD도 여전히 필요한 경우도 있을 수 있습니다.
예를 들어, Swift Concurrency 내에서 GCD를 사용하여 특정 작업을 처리하거나, Swift Concurrency로 작성된 코드를 기존 GCD 기반의 프로젝트에 통합하는 등의 상황이 있을 수 있습니다.

댓글
공지사항