티스토리 뷰

Swift

[Swift] Concurrency(1) - Concurrency란

Kim_Baechu 2022. 12. 14. 23:47

Concurrency(1) - Concurrency란

Swift는 비동기 및 병렬 코드를 작성할 수 있도록 지원합니다.

비동기 코드는 한 번에 하나의 프로그램만 실행되지만 나중에 일시 중단했다가 다시 시작할 수 있습니다.

프로그램에서 코드를 일시 중단했다가 다시 시작하면 네트워크를 통해 데이터 가져오기 또는 파일 파싱과 같은 장기 실행 작업을 계속하면서 UI 업데이트와 같은 단기 작업을 계속 진행할 수 있습니다.

 

병렬 코드는 여러 코드 조각이 동시에 실행되는 것을 의미합니다.

예를 들어, 4코어 프로세서가 있는 컴퓨터는 4개의 코드 조각을 동시에 실행할 수 있으며 각 코어는 작업 중 하나를 수행합니다.

병렬 및 비동기 코드를 사용하는 프로그램은 한 번에 여러 작업을 수행합니다.

이 프로그램은 외부 시스템을 기다리는 작업을 일시 중단합니다.

그리고 메모리 안전한 방식으로 이 코드를 쉽게 작성할 수 있도록 합니다.

 

병렬 또는 비동기 코드의 추가적인 스케줄링 유연성은 또한 복잡성 증가의 비용을 수반합니다.

Swift를 사용하면 컴파일 타임 체킹을 사용할 수 있는 방식으로 의도를 표현할 수 있습니다.

예를 들어, 액터를 사용하여 변경 가능한 상태에 안전하게 액세스할 수 있습니다.

 

그러나 속도가 느리거나 버그가 많은 코드에 동시성을 추가한다고 해서 그것이 빠르거나 정확해진다는 보장은 없습니다.

실제로 동시성을 추가하면 코드를 디버깅하기가 더 어려워질 수도 있습니다.

그러나 Swift의 언어 수준에서 동시성이 필요한 코드를 위한 concurrency는 컴파일 시 문제를 파악하는 데 Swift가 도움을 줄 수 있습니다.

이 장의 나머지 부분에서는 비동기 및 병렬 코드의 일반적인 조합을 나타내기 위해 동시성(concurrency)이라는 용어를 사용합니다.

메모

이전에 동시 코드를 작성한 적이 있는 경우 스레드 작업에 익숙해질 수 있습니다. Swift의 동시성 모델은 스레드 위에 구축되지만 사용자는 스레드와 직접 상호 작용하지 않습니다. Swift의 비동기 함수는 실행 중인 스레드를 포기할 수 있으므로 첫 번째 함수가 차단되는 동안 해당 스레드에서 다른 비동기 함수를 실행할 수 있습니다. 비동기 함수가 다시 시작될 때 Swift는 해당 함수가 실행될 스레드에 대해 어떠한 보증도 하지 않습니다.

Swift의 언어 지원을 사용하지 않고 동시 코드를 작성할 수 있지만, 코드를 읽기가 더 어려운 경향이 있습니다.

예를 들어, 다음 코드는 사진 이름 목록을 다운로드하고 해당 목록의 첫 번째 사진을 다운로드한 다음 사용자에게 해당 사진을 표시합니다.

listPhotos(inGallery: "Summer Vacation") { photoNames in
    let sortedNames = photoNames.sorted()
    let name = sortedNames[0]
    downloadPhoto(named: name) { photo in
        show(photo)
    }
}

이 간단한 경우에도 코드를 일련의 completion handlers로 작성해야 하므로 중첩된 클로저를 작성하게 됩니다.

이 스타일에서는 중첩이 더 많은 복잡한 코드를 빠르게 다루기 어려워질 수 있습니다.

 

[iOS] Concurrency(2) - 비동기함수 정의와 호출

댓글
공지사항