목록Swift/동시성 프로그래밍 (7)
GGURUPiOS

Actor 등장배경 동시성 프로그래밍을 작성할 때 어려운 문제 중 하나는 Data races를 피하는 것임 Data Races? → 두 개의 개별 스레드가 동시에 동일한 데이터에 액세스하고 액세스 중 하나 이상이 쓰기인 경우 발생 Data Races 는 디버깅하기 매우 어려움 예를 들어보자 Counter 라는 클래스를 생성하고, 클래스 내부의 value 값을 증가시키는 increment 함수를 생성함 기대하는 출력 값은 1,2 혹은 2,1 이지만 두 Task 모두 0을 읽고 1을 증가 시키면 1,1 혹은 2,2 가 출력될 수 있음 race를 유발하는 액세스가 다른 부분에 있을 수 있기 때문에 추론이 필요함 → 디버깅이 어려움 data race는 공유 가변 상태(shared mutable state)에 의..

Strucuted Concurrency 배경 스위프트에서 structured concurrency 는 structured programming 에 기반을 둔 개념임 간단히 말해서 구조화된 프로그래밍은 위에서 아래로 읽히기 때문에 제어 흐름과 변수의 수명을 이해하기 쉽게 함 그러나 오늘날의 프로그램은 비동기, 동기를 같이 사용하기 때문에 구조화된 프로그래밍을 사용하기 어려웠다. ( 예를들어, 네트워킹이 필요한 작업에서 콜백함수를 호출 한다던가 하는 ) 그러나 async/await 는 구조화된 프로그래밍 기반으로 만들어 졌기 때문에, async/await 로 구조화된 프로그래밍이 가능해 짐 그러나, 만약 위와 같은 코드에서 수천 개의 이미지에 대해 썸네일을 생성한다고 했을 때 → 각 섬네일을 한 번에 하나씩..

Concurrency Concurrency는 Swift 공식문서 정리할 때도 한 번 봤었는데 그 때 헷갈렸던 내용을 이번에 제대로 정리하고자 함 Concurrency 는 Swift 5.5에서 구현된 새로운 기능으로, 비동기적인 코드 작성을 보다 쉽게 만들어 줌 이를 위해 몇 가지 새로운 기능과 개념이 도입됨 공식문서에 있는 내용들 크게 세부분으로 나눌 수 있음 async/await structured concurrency actors Async/await 등장 배경 (그동안의 문제점? 정도) 자세한 건 하나하나 알아보겠습니다. 명시적 콜백(completion, completionHandler)를 사용하는 비동기 프로그래밍 에는 많은 문제가 크게 5가지가 있음 1. Pyramid of doom 간단한 비동..

Operation GCD를 객체지향적으로 새롭게 추가된 API임 GCD와의 차이점은 GCD에서의 코드블럭들(Task)을 캡슐화, 객체화 해낸 것임 객체화의 장점 재사용 용이 타입 간 관계 형성 다양한 프로퍼티 활용 스케쥴링에 용이 Operation Operation은 추상클래스이기 때문에 이를 상속 받는 타입을 사용해야함 2가지 방법 BlockOperation 사용 커스텀 클래스 사용 만들기 BlockOperation은 Operation의 하위 클래스임 let operation = BlockOperation { } // addExecutionBlock은 BlcokOperation 메서드임 // 이 메서드는 Operation 동작이 끝난 후 원하는 코드를 실행 해줄 수 있음 operation.addExec..
GCD (2) 활용 DispatchQueue를 main, global() 말고 커스텀해서 사용할 수 있음 DispatchQueue의 초기화 convenience init(label: String, qos: DispatchQoS = .unspecified, attributes: DispatchQueue.Attributes = [], autoreleaseFrequency: DispatchQueue.AutoreleaseFrequency = .inherit, target: DispatchQueue? = nil) label let dispatchQueue = DispatchQueue(label: "ggurup") DispatchQueue의 label을 설정해주는 파라미터 DispatchQueue의 이름은 변수나 ..

GCD (Grand central Dispatch) GCD는 동시성 환경에서 작업을 실행하기 위한 API를 제공함 시스템 수준에서 스레드 및 대기열 관리를 처리함 비동기 실행되는 작업을 쉽게 처리할 수 있고 작업 간의 의존성이나 순서를 지정할 수 있음 DispatchQueue는 GCD를 사용하기 위한 대기열로, 대기열에 작업을 추가해서 작업을 처리하도록 도와줄 것임 (First In, FirstOut) DispatchQueue에 작업을 넘길 때는 2가지를 정해주어야 함 단일, 다중 스레드 여부 ( Serial / Concurrent ) 동기, 비동기 여부 ( sync / async ) DispatchQueue가 GCD와 같은 개념은 아니고, GCD가 더 넓은 개념임 GCD는 Dispatch라는 프레임워크..