◼ Swift에서 Asychronous & parallel 코드가 지원되며
본문에선 두 개념의 combination으로 "Concurrency"라 표현하겠다
예로,
- 외부 시스템의 응답을 기다리는 동작을 병렬적으로 suspend시키고
- 메인 코드는 그대로 진행시키는 구현이 있겠다
여기서 suspend된 코드와 메인 코드를 수행하는 core가 다르며
suspend된 동작은 외부 시스템 응답이 도착하면 이어서 진행된다
◼ 하지만, 이런 병렬성이 항상 좋진 않을 수 있음을 경고한다
느리고 후진 코드는 속도나 정확성이 오히려 떨어질 수 있고 디버깅이 어려워진다
그래서 Swift가 language-level에서 concurrency를 지원하여
컴파일 타임에 문제를 잡을 수 있도록 도와줄 것이다
🔹 NOTE
Swift에선 thread가 실행중이던 async function을 block하고 다른 aync function을 실행하러 갈 수도 있다
◼ Swift의 language-level에서의 support없이 concurrency를 구현할 수도 있지만 읽기 어렵다
Async 함수 정의
보통의 함수/메소드는,
실행이 완료되거나 / 에러를 throw하거나 / return되지않는다
하지만 async 함수는 코드 flow는 유지하면서, 무언가(ex. 외부시스템)를 기다리는 쓰레드 branch를 생성할 수 있다
1️⃣ 먼저, async 키워드를 붙혀 suspend될 수 있는 function임을 알린다
func listPhotos(inGallery name: String) async -> [String] {
let result = // ... some asynchronous networking code ...
return result
}
(참고로, throws와 async를 둘 다 써야하는 상황이면 async throw순으로 쓴다)
2️⃣ async 함수를 호출할 땐 await를 붙혀준다
let photoNames = await listPhotos(inGallery: "Summer Vacation")
let sortedNames = photoNames.sorted()
let name = sortedNames[0]
let photo = await downloadPhoto(named: name)
show(photo)
◼ 동작설명
- 코드는 첫번째 await (listPhotos) 가 나타날 때까지 평범하게 수행된다.
execution은 listPhotos가 return될 때까지 suspend 된다 - listPhotos를 기다리는 execution은 두고, another execution이 코드를 킵고잉한다
- suspended execution은 listPhotos가 끝나면 sortedNames에 return 값을 할당한다
'Swift > Language Guide' 카테고리의 다른 글
(작성중) Extension (0) | 2021.09.21 |
---|---|
Nested Types (0) | 2021.09.19 |
Inheritance (상속) (0) | 2021.09.18 |
Subscripts (0) | 2021.09.17 |
Enumerations(열거형) (0) | 2021.09.16 |
댓글