[Swift 5.5]


작년에 WWDC와 많은 주제 중 하나에 대해 처음 들었습니다.

현대 병렬 처리(async/await,actor etc..) 소개 영상을 봤습니다.

영상에서 “Structured Parallelism”이라고 계속 말했는데 그 부분만 해석이 안되고 관련 개념이 떠오르지 않아서 당황스러웠는데 이제야 알겠네요. 자세한 내용은 독수리나는 이 글을 읽으면서 배운 것을 요약하기 위해 이 글을 썼다.

구조화된 동시성

동시성 시스템은 기본 도구를 제공합니다.

현재 실행 중인 대부분의 스레드는 새로 생성된 스레드와 동시에 실행되어야 합니다.

공유 시스템 리소스가 제한되어 있으므로 다른 스레드가 신호를 보내 스레드 폭발을 방지하기 위해 기다리는 방법도 알아야 합니다.

우선 순위가 높은 작업을 먼저 완료해야 합니다.

이 작업을 빨리 완료하려면 스레드의 우선순위를 확장하고 스레드 내에서 작업의 우선순위를 지정해야 합니다.

모범 사례는 첫 번째 스레드가 비용을 지불할 때까지 두 번째 스레드를 확장하지 않는 것입니다.

그리고 두 번째 스레드를 등록하면 이 문제를 일시적으로 해결할 수 있습니다.

구조화된 동시성은 이러한 문제를 해결합니다.

프로그램 제작자상위 수준 작업과 하위 작업으로 구성된 동시성 사용을 조작하도록 작업에 요청하여 이를 수행합니다.

이 작업은 스레드와 같은 저수준 개념이 아닌 동시성의 가장 기본적인 단위가 됩니다.

동시성을 구조화하는 이 방법을 사용하면 각 추상화 수준 및 스위칭 스레드에서 신중하게 설계된 리소스가 필요한 작업의 계층 구조에서 정보가 원활하게 위아래로 흐를 수 있습니다.

이것은 많은 높은 수준의 문제를 해결할 수 있습니다.

구조화된 동시성 예

  • 일반적으로 작업의 실행 시간을 제한합니다.

    시간 초과를 허용하여 이를 지원하는 API가 있습니다.

    모든 수준의 추상화를 통해 작업하는 것은 프로그래머가 제한 시간을 비교적 직접 설정하기 때문에 시간이 많이 걸립니다.

    따라서 구조화된 동시성을 사용하면 작업의 기한을 설정하고 모든 수준에서 API를 통해 하위 작업을 포함하여 전파하는 것이 가능해야 합니다.

  • 활성 작업을 취소할 수 있어야 합니다.

    비동기 인터페이스는 cancel() 메서드를 통해 토큰 객체를 동기식으로 반환하여 이를 지원합니다.

    취소 디자인은 너무 복잡해서 API에서 토큰 전파 및 취소를 구성하면 심각한 문제가 발생할 수 있습니다.

    일부 API는 이를 지원하지 않습니다.

    (GCD에서 DispatchWorkItem은 취소를 지원합니다.

    ) 구조화된 동시성을 사용하면 API 덕분에 자연스럽게 취소가 하위 작업으로 전파되며 취소에 대한 조치는 핸들러를 통해 처리되어야 합니다.

  • GUI는 시기적절한 업데이트 및 이벤트를 보장하기 위해 작업 우선 순위에 의존하는 경우가 많습니다.

    물론 구조화된 동시성에서 자식 작업은 이를 호출한 부모 작업의 우선 순위를 상속할 수 있어야 합니다.

    우선 순위가 높은 작업이 우선 순위가 낮은 작업이 완료될 때까지 기다려야 하는 경우 하위 작업의 우선 순위를 높일 수 있습니다.

  • 많은 시스템은 추상 수준을 거치지 않고 자체 컨텍스트 정보를 유지하는 것을 선호합니다.

    현재 서버로 전송 중인 연결 정보를 기록하지 않는 것이 그 예입니다.

    구조화된 동시성은 비동기 작업을 통해 자식 작업에서 상속할 수 있는 “작업-로컬 저장소”로 자연스럽게 전파될 수 있습니다.

  • 대기열 시스템은 실제로 처리할 수 있는 것보다 더 많은 작업을 수락할 때 대기열 플러딩이 발생합니다.

    자주 취약해질 수 있습니다.

    이는 일반적인 “카운터 압력”으로 대응할 수 있습니다.

    수락한 새 작업을 취소하고 작업을 대기시키려고 하면 시스템 자체가 작업을 중지시키는 작업으로 시스템이 불안정해질 수 있다고 합니다.

    구조화된 동시성은 제한된 협업 솔루션을 제공해야 합니다.

    시스템이 번거로운 작업 계층과 통신할 수 있도록 허용하여 잠재적으로 상위 작업을 중지하거나 유사한 새 작업의 생성 속도를 늦춰야 합니다.

그 느낌이 Structured Concurrency이고 Swift 5.5에서는 Concurrency, Async/Awiat, Task, Child Tasks, Jobs, Executor, Task Priorities 등이 이 원래 공식을 기반으로 설계되었습니다.

참조

https://github.com/apple/swift-evolution/blob/main/proposals/0304-structured-concurrency.md