ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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 Concurrency  (0) 2022.03.20
    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

    댓글 0

Designed by Tistory.