2014년 6월 18일 수요일

Swift - 병렬 프로그래밍(Concurrency Programming) 가이드

병렬 프로그래밍(Concurrency Programming) 이란 멀티스레딩 혹은 멀티프로세싱이란 말과 비슷한 개념이다. 백그라운드(background) 혹은 비동기(Asynchronous)로 작업을 처리한다던가, 동시에 여러가지 일을 처리하도록 하려면 이 병렬 프로그래밍에 대해 알아야한다. 여기서는 Swift에 한정해서 다룬다.

참고로 스위프트가 쓰였기 때문에 SDK 버전 제한은 OS X 10.10(요세미티)와 iOS 8.0이 된다고 생각된다. 따라서 기존 Objective-C 방식과 약간의 차이가 있을 수 있다. 하지만 Objective-C를 사용하던 기존과 큰 차이는 없다.

세 가지 기법

애플은 병렬 프로그래밍을 위해 대략 3가지 기술을 제공한다.
  • 스레드(Thread): NSThread
  • NSOperationQueue
  • GCD(Grand Centeral Dispatch)
모두 특정 작업을 동시에 혹은 백그라운드로 처리하기 위한 용도의 개념이다.

NSThread

전 언어를 통들어 일반적으로 많이 쓰이는 병렬프로그래밍 기술은 아마도 멀티스레드(Multi Threading)인 것 같다. 물론 애플도 멀티스레드를 위한 NSThread 클래스를 제공한다.

멀티스레딩은 여러 면에서 좀 귀찮은 점이 있다. 모든 작업마다 스레드를 만드는 건 병렬 프로그래밍에서 비효율을 유발 할 수도 있고 그래서 귀찮게 스레드풀(Thread Pool)을 관리해야 하는 것도 더 큰 귀찮음을 유발한다.

물론 전통적인 설계를 따른다면 스레드도 나쁜 선택은 아니다.

[상세글] Swift - NSThread 병렬 프로그래밍 기초

NSOperationQueue

작업 큐(Operation Queue) 라는 방식으로 병렬 프로그래밍을 하기 위한 개념이다. 큐에다 단일 작업을 필요한 것 만큼 넣어놓으면 알아서 척척 꺼내서 별도의 스레드에서 실행시켜준다. 개인적으로 가장 OOP에 어울리는 기술이라고 생각한다.

멀티스레딩의 스레드 풀 관리 스트레스에 지친다면 좋은 대안이다.

[상세글] Swift - NSOperationQueue 병렬 프로그래밍 기초

GCD Dispatch

개념적으로 본다면 NSOperationQueue와 NSOperation을 사용하는 것과 거의 비슷하다. 하지만 구현이 더 간단하다는 크나큰 장점이 있다. 특징적으로 C API (즉 함수)로 구성되어 있고 클로져를 많이 활용한다.

참고로 아래의 글들은 Swift 3 를 기준으로 업데이트 하였다. Swift 3 에서는 함수로 제공되던 것들이 클래스로 새롭게 디자인 되었다.

[상세글] Swift - GCD(Grand Central Dispatch) 기초
[상세글] Swift - Dispatch Queue
[상세글] Swift - Dispatch Group
[상세글] Swift - GCD 세마포어(Dispatch Semaphore)

OS X 10.10, iOS 8 SDK로 오면서 생긴 변화(Xcode 6 Beta 3 기준)

기존 NSThread와 NSOperation 클래스에서 제공되던 isCancelled() 라는 메소드가 사라졌다. 대신 cancelled 프로퍼티가 새롭게 추가되었다. isCancelled() 메소드가 cancelled 프로퍼티로 변했다고 하는 표현이 맞을지도 모르겠다. 어차피 값은 동일하고 용도도 동일하다.

큰 변화는 아니지만 기존 코드 변경이 필요하다는 이이야기다.

[관련글] 스위프트(Swift) 가이드

댓글 1개 :

익명 :

글 잘 보고 갑니다. 감사해요