-
Swift 5.6 Concurrency기술/iOS 2022. 3. 20. 17:53
Concurrency
Defining and Calling Asynchronous Functions
비동기 함수 또는 비동기 메서드는 실행 도중에 일시적으로 중단될 수 있는 특수한 함수 또는 메서드 입니다. 이것은 완료될 때까지 실행되거나 오류가 발생하거나 반환되지 안흔ㄴ 한 일반적 동기 함수 또는 메서드와 대조도비니다. 비동기 함수 또는 메서드는 이 세가지 중 하나를 수행하지만 무언가를 기다리고 있을 때 중간에 일시 중지될 수 있습니다. 비동기 함수 또는 메서드의 바디 내에서 실행을 일시 중지할 수 있는 부분을 표시합니다.
함수 또는 메서드가 비동기 임을 나타내려면 던지는 async 키워드를 작성합니다.
비동기 메서드를 호출할 때 해당 메서드가 반환될 때까지 실행이 일시 중단됩니다. 중단될 가능성이 있는 지점을 표시하기 위해 호출 앞에 await 을 작성합니다.
Asynchronous Sequences
import Foundation let handle = FileHandle.standardInput for try await line in handle.bytes.lines { print(line) }
Calling Asynchronous Functions in Parallel
비동기 함수를 호출하고 코드를 병렬로 실행하려면 async 키워드를 작성합니다.
async let firstPhoto = downloadPhoto(named: photoNames[0]) async let secondPhoto = downloadPhoto(named: photoNames[1]) async let thirdPhoto = downloadPhoto(named: photoNames[2]) let photos = await [firstPhoto, secondPhoto, thirdPhoto] show(photos)
Tasks and Task Groups
작업은 프로그램의 일부로 비동기적으로 실행할 수 있는 작업 단위입니다. 모든 비동기 코드는 어떠한 작업의 일부로 실행됩니다. 이전 섹션에서 설명한 async let 구문은 하위 작업을 생성합니다. 작업 그룹을 생성하고 해당 그룹에 하위 작업을 추가할 수 있습니다. 그러면 우선순위와 취소를 더 잘 제어할 수 있으며 동적으로 작업의 수를 생성할 수 있습니다.
작업은 계층 구조로 정렬됩니다. 작업 그룹의 각 작업에는 동일한 상위작업이 있으며 각 작업에는 하위 작업이 있을 수 있습니다. 작업과 작업 그룹간의 명시적 관계 때문에 이 접근 방식을 구조적 동시성이라고 합니다. 정확성에 대한 일부 책임을 지고 있지만 작업깐의 명시적 부모-자식 관계를 통해 Swift는 취소 전파 같은 일부 동작을 처리할 수 있고 Swift 는 컴파일 시간에 일부 오류를 감지할 수 있습니다.
Unstructured Concurrency
구조화된 접근 방식외에도 구조화 되지 않은 동시성을 지원합니다. 작업 그룹의 일부인 작업과 달리 구조화되지 않은 작업에는 상위 작업이 없습니다. 프로그램이 필요로 하는 방식으로 구조화되지 않은 작업을 관리할 수 있는 완전한 유연성이 있지만 정확성에 대한 완전한 책임도 있습니다. 현재 행위자에서 실행되는 구조화 되지 않은 작업을 생성하려면 Task.init(priority:operation:) 초기화 구문을 호출해야 합니다. 더 구체적으로 분리된 작업으로 알려진 현재 행위자가 일부가 아닌 구조화 되지 않은 작업을 생성하려여면 Task.detached(priorirty:operation:) 클래스 메서드를 호출합니다. 이 모든 동작은 작업과 상호작용할 수 있는 작업 핸들을 반환합니다.
Task Cancellation
Swift 동시성은 협동 취소 모델을 사용합니다. 각 작업은 실행의 적절한 시점에 취소되엉ㅆ는지 확인하고 적절한 방법으로 취소에 응답합니다. 수행중인 작업에 따라 일반적으로 다음 중 하나를 의미합니다.
- CancellationError 와 같은 에러 발생
- nil 또는 빈 콜렉션 반환
- 부분적으로 완료된 작업 반환
취소를 확인하려면 작업이 취소된 경우 CancellationError 를 발생시키는 Task.checkCancellation() 을 호출하거나 Task.isCancelled 의 값을 확인하고 자체 코드에서 취소를 처리합니다.
취소를 수동으로 전파하려면 Task.cancel() 을 호출합니다.
Actors
클래스와 마찬가지로 행위자는 참조타입입니다. 클래스와 다르게 행위자는 한 번에 하나의 작ㅇ버암ㄴ 변경 가능한 상태에 접근할 수 있도록 허용하므로 여러 작업의 코드가 행위자의 동일한 인스턴스와 상호작용하는 것은 안전합니다.
await 없이 행위자의 프로퍼티에 접근하는 것은 행위자의 프로퍼티가 해당 행위자의 분리된 로컬 상태의 부분이기 때문에 실패합니다. Swift 는 행위자 내부의 코드만 행위자의 로컬 상태에 접근할 수 있도록 보장합니다. 이 보장을 행위자 분리라고 합니다.
'기술 > iOS' 카테고리의 다른 글
Swift 5.6 Error Handling (0) 2022.03.20 Swift 5.6 Optional Chaining (0) 2022.03.20 Swift 5.6 Deinitialization (0) 2022.03.20 Swift 5.6 Initialization (0) 2022.03.20 Swift 5.6 Inheritance (0) 2022.03.20 TAG