본문 바로가기
Swift/Language Guide

(작성중) Concurrency

by diosmio 2021. 9. 19.

◼ 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)

◼ 동작설명

  1. 코드는 첫번째 await (listPhotos) 가 나타날 때까지 평범하게 수행된다. 
    execution은 listPhotos가 return될 때까지 suspend 된다
  2. listPhotos를 기다리는 execution은 두고, another execution이 코드를 킵고잉한다
  3. suspended execution은 listPhotos가 끝나면 sortedNames에 return 값을 할당한다
  4.  

'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

댓글