Currency Programming Guide (1/2)
Currency Programming Guide (2/2)
WWDC 2016 Concurrent Programming With GCD in Swift 3 를 정리한 포스트입니다.
더 자세한 내용을 원하시면 위 링크를 참조하시길 바랍니다.
동시성 도입에 대한 대가로 스레드 안전성을 유지하기가 어렵습니다.
GCD는 우리 플랫폼의 동시성 라이브러리입니다.
Apple Watch에서 모든 iOS 장치를 통해 작동하는 코드, 멀티 스레드 코드를 작성하는 데 도움이됩니다.
Dispatch Queues and Run Loops
자신의 스레드를 만들 수 있으며, 그 스레드에서 실행 루프를 실행할 수 있습니다.
Main스레드는 유일하게 Main Run Loop 와 Main Queue를 가질 수 있습니다.
Asynchronous Execution
DispatchQueue에는 작업을 제출할 수있는 두 가지 주요 방법이 있습니다.
첫 번째는 비동기 실행입니다.
Dispatch는 하나씩 해당 대기열에서 항목을 가져 와서 실행합니다.
그런 다음 대기열의 모든 항목이 완료되면 시스템은 구입 한 스레드를 회수합니다.
Synchronous Execution
작업을 디스패치 큐에 제출하면 차단 될 위치입니다.
실행 요청한 항목이 완료 될 때까지 대기합니다.
DispatchQueue는 대기중인 스레드로 제어를 전달하고 해당 항목을 실행 한 다음 DispatchQueue의 제어가 디스패치에 의해 제어되는 작업자 스레드로 다시 리턴됩니다.
해당 큐에있는 나머지 항목을 계속 비운 다음 사용중인 스레드를 회수합니다.
Getting Work Off Your Main Thread
메인 스레드에서 수행 한 Transform을 가져 와서 다른 큐에서 실행하면 됩니다.
Transform을 수행 할 수 있으며 DispatchQueue를 사용하여 변환 할 수 있습니다.
이제 Data를 변환하려는 경우 해당 데이터의 값을 다른 큐의 변환 코드로 이동합니다.
Data 는 변환 된 후 다시 Main 스레드로 보낼 수 있습니다.
코드는 어떨까요?
레이블이 필요하며 응용 프로그램을 작성할 때 해당 레이블이 디버거에 표시됩니다.
DispatchQueue는 사용자가 먼저 제공 한 작업을 순서대로 실행합니다.
그 DispatchQueue에서 .async 메소드를 사용하여 해당 큐에 작업을 제출할 수 있습니다.
Main 스레드로 다시 가져 오는 방법은 무엇입니까?
DispatchQueue main을 호출 한 다음 해당 기본 큐에서 비동기를 호출하면 해당 코드가 실행되고
사용자 인터페이스를 업데이트 할 수 있습니다.
Controlling concurrecy
응용 프로그램에서 동시성을 제어하는 비용이 듭니다.
스레드 풀은 장치의 모든 호출을 사용하기 위해 달성한 동시성을 제한합니다.
그러나 이러한 스레드를 차단할 때 애플리케이션의 다른 부분을 기다리거나 sys에서 대기하는 경우 차단된 worker 스레드가 더 많이 생성될 수 있습니다.
디스패치는 당신에게 코드를 계속 실행할 수 있는 새로운 스레드를 줌으로써 당신에게 마땅한 동시성을 주려는 것입니다.
이는 코드를 실행하는 데 사용할 발송 대기열의 올바른 개수를 선택하는 것이 매우 중요하다는 것을 의미합니다.
또 하나의 실이 올라오고, 또 하나의 실이 막히는 등의 패턴은 우리가 '실폭발'이라고 부릅니다.
Structuring Your Application
애플리케이션 영역을 독립적인 데이터 흐름으로 식별하는 것이 좋습니다.
지금까지 살펴본 것처럼 이미지 변환이거나 데이터베이스가 있을 수 있습니다.
이러한 영역을 서로 다른 하위 시스템으로 분할한 다음 각 전송 대기열을 사용하여 하위 시스템을 백업합니다.
이렇게 하면 너무 많은 대기열과 너무 많은 스레드의 문제를 겪지 않고 각 하위 시스템에서 작업을 독립적으로 실행할 수 있는 대기열이 제공됩니다.
Chaining vs. Grouping Work
하나의 블록을 다른 블록과 비동기 대기열로 비동기화 한 다음 기본 대기열로 다시 동기화 할 수 있습니다.
이것은 그룹화 작업이고 그 작업이 끝나기를 기다리는 것입니다.
Chaining
Grouping
여러 개의 서로 다른 작업 항목을 생성하려는 단일 작업 항목이 있고
해당 작업 항목이 완료되었을 때만 작업을 진행하려는 경우 해당 작업을 수행할 수 있습니다.
DispatchGroup
따라서 이전 도표로 돌아가서 사용자 인터페이스에서 세 가지 작업 항목을 생성하면 Dispatch 그룹을 만들 수 있습니다.
디스패치 그룹은 여러분이 작업을 추적하는 것을 도울 수 있습니다.
Work 를 Dispatch에 Submit 하면 비동기 호출에 그룹을 선택적 매개 변수로 추가할 수 있습니다.
해당 그룹에 더 많은 작업을 추가하고 다른 큐에 작업을 수행 할 수 있으면서도 동일한 그룹과 연관시킬 수 있습니다.
그리고 DispatchGroup에 Work을 Submit할 때마다 Group이 완료될 것으로 예상되는 항목의 카운터를 증가시킵니다.
마지막으로 모든 작업을 제출 한 후에는 그룹에 모든 작업이 완료된 시점을 알리도록 요청 (notify(queue:)) 하고 선택한 대기열에서 작업을 지시 할 수 있습니다.
이제 항목들이 하나씩 실행되기 시작하고 그룹에서 실행 횟수에 따라 작업 항목이 완료 될 때마다 감소합니다.
Synchronizing Between Subsystems
동기식 실행을 사용하여 하위 시스템 간의 상태를 직렬화(Serial) 할 수 있습니다.
상호 배제(mutual exclusion) 상태가 됩니다.
즉, 작업을 해당 대기열에 동시에 제출하면 해당 대기열에서 하위 시스템이 실행되고 있는 작업이 동시에 실행되고 있지 않다는 것입니다.
Be aware of “lock ordering” introduced between subsystems
하지만, 이 패턴을 도입하기 시작할 때 주의해야 합니다.
이전에 사용했던 서브시스템이 있는 경우, 한 곳에서 다른 곳으로 동기화한 후 마지막으로 첫 번째 서브시스템으로 다시 동기화합니다.
이럴때를 DeadLock (교착상태)라고 부릅니다.
참조:
https://developer.apple.com/videos/play/wwdc2016/720
https://zeddios.tistory.com/509
https://hcn1519.github.io/articles/2018-07/gcddispatchqueue
'iOS > WWDC' 카테고리의 다른 글
[WWDC 2019] Optimizing App Launch (0) | 2019.10.08 |
---|---|
[WWDC 2018] LLDB 코드 수정 없이 Debugging 해보자! (0) | 2019.10.04 |
[WWDC 2016] Currency Programming Guide (2/2) (0) | 2019.09.28 |
[WWDC 2018] iOS Memory Deep Dive (2/2) (0) | 2019.09.27 |
[WWDC 2018] iOS Memory Deep Dive (1/2) (0) | 2019.09.26 |