-
[Swift] Actor (비동기 환경에서 Data Race 를 피해보자) - #1Swift 2023. 5. 6. 03:10
🤔 What and Why..
회사에서 새로운 기능을 개발하면서 페이지 패칭과 로딩 스피너를 async/await 를 활용해서 구현했습니다.
빠르게 스크롤을 내리다보니 빠르게 페이지가 넘어가면 비동기적으로 패치가 불리게 되었고 그와중에 각종 변수의 값이
저의 예상과는 다르다는 것을 알게 되어서 공부의 필요성을 느끼게 되었습니다.
처음에는 NSLock, Semaphore 등을 공부해보려 했지만 Swift 의 최신 문법등과 잘 어울어질만한 Actor 을 공부하게 되었습니다.
🕴🏻 Actor?
actor 는 class, enum, struct 과 같이 타입중 하나이며 참조 타입으로써 차이라면 동기적으로 상태에 접근한다는 것입니다.
이게 무슨 의미인지는 아래 코드에서 봅시다.
💻 Code
아래를 보시면 뭔가 기대값이 이상하다는 것을 아실수 있습니다.
순서대로 1...20이 찍히지 않고 순서가 이상합니다. 왜일까요?
바로 Task 로 감싸져 비동기적으로 실행이 되었기 때문입니다.
하지만 조금더 생각해보면 어차피 increase 는 20번 실행되었을탠데
왜 순서대로 프린트가 찍히지 않을 걸까?
그것을 바로 class 에서 내부를 참조할때 순서에 따라 실행된것이 아니기 때문입니다.
import Foundation class Counter { var count = 0 func increase(times: Int) { for _ in 1...times { Task { count += 1 print(count) } } } } let counter = Counter() counter.increase(times: 20) // 출력 1 2 4 ✓ 5 6 7 8 9 3 ✓ 10 11 12 13 14 15 16 17 18 19 20
아래는 actor 로 선언된 counter 입니다.
20번을 실행하는데 순서대로 찍혔죠?
왜냐하면 순서대로 참조가 되었기 때문입니다.
import Foundation actor Counter { var count = 0 func increase(times: Int) { for _ in 1...times { Task { count += 1 print(count) } } } } Task { let counter = Counter() await counter.increase(times: 20) } // 출력 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
참고 👇👇
Protect mutable state with Swift actors - WWDC21 - Videos - Apple Developer
Data races occur when two separate threads concurrently access the same mutable state. They are trivial to construct, but are notoriously...
developer.apple.com
'Swift' 카테고리의 다른 글
TIL - 비동기에는 비용이 존재한다 (2) 2023.05.06 [Swift] Actor #2 - @MainActor (class 와 같이 사용하기) (0) 2023.05.06 [Swift] Protocol 을 처음 부터 공부해보자 (0) 2023.05.02 [Swift] 디버그 할때 유용한 기능들 (0) 2023.04.28 [Swift] URL로 다른 앱 열기 (0) 2023.04.25