@Sendable

👋 들어가기 전
두번 째 attribute는 @Sendable이다.
아무래도 배우는 attribute들의 순서가 고민이 많았는데
Conccurency의 가장 기본이 되는 Sendable attribute부터 살펴보자.
🏁 학습할 내용
- Sendable 프로토콜
- @Sendable
✈️ Sendable 프로토콜
📋 정의

안전하게 공유될 수 있다는 의미는 멀티스레딩 환경에서 안전하게 데이터 공유가 가능하다는 뜻
동시성 프로그래밍의 고질적인 문제를 해결할 수 있는 중요한 내용이다.
❓어떻게 채택할 수 있는데?
암묵적으로 채택될 수 있는 타입별 조건은 다음과 같다.
- 값 타입
- 모든 멤버가 Sendable일 때
- @frozoen이면 안됨 ❌
- public이면 안됨 ❌
- 열거형
- 모든 멤버 및 associatedValue까지 모두 Sendable일 때
- @frozoen이면 안됨 ❌
- public이면 안됨 ❌
- 클래스
- final
- 클래스의 모든 멤버는 let으로 선언
- 클래스의 모든 멤버는 Sendable
- NSObjec를 제외한 어떤 수퍼 클래스도 가질 수 없음
- 엑터
- 모두 Sendable을 채택한 요소로 구성된 튜플
- 메타 타입 ex) Int.Type
⚠️ 주의할 점
actor가 아닌 참조타입 즉, 클래스는 위 형태처럼 특별한 상황이 아니면
대부분 Sendable이 아니므로 멀티스레드 환경에서 사용에 주의하자.
🛜 @Sendable
📋 정의
공식 문서 Sendable Functions and Closures 를 살펴보면 @Sendable 속성을
살펴보면 컴파일 시점에 클로저 내부 context를 Sendable한 환경임을 검사하는 느낌이다.
즉, 클로저가 Sendable 하냐를 검사하는 느낌, 클로저가 Sendable하면
멀티 스레딩에서 공유가 안전하다는 의미를 나타낸다.
✨ 역할
🤝 프로토콜 채택을 대신한다.
Sendable 프로토콜을 채택하는 대신 @Sendable 속성으로 클로저 또는 함수가
Sendable 하다는 것을 검사한다.
⚠️ 주의할 점
여기서 주의할점은 클로저 / 함수는 참조타입이라는 점이다.
그러므로 @Sendable 속성을 사용하고 싶다면 다음과 같은 제약조건을 지켰을 경우에만 사용할 수 있다.
- 클로저나 함수가 캡쳐한 모든 값은 Sendable을 만족해야한다.
- 클로저는 오직 값으로만 캡쳐만 가능하다.
- Sendable 클로저를 기대하는 상황에서, 해당 조건을 만족하는 클로저는 자동으로 Sendable로 간주된다.
- 대표적으로 Task.detached 클로저가 있다.
⌨️ 사용 예시
1. 클로저 / 함수 에 Sendable 기대
Task.detached { @Sendable in
//
}
@Sendable func sendableFunction() async throws {
}
2. 타입 명시
let sendableClouser: @Sendable () -> Void = {
print("Hello")
}
sendableClouser()
func wraaperFun(_ handler: @Sendable () -> Void) {
handler()
}
wraaperFun {
print("Sendable wrapperFun")
}
😀 소감 및 마무리
흠 여기서 의문이 런타임에서도 100% Sendable을 보장할까??
라는 의문점이 있다.
의문점이 해결되면 코멘트를 남겨놓겠다.
출처
https://developer.apple.com/documentation/swift/sendable
Sendable | Apple Developer Documentation
A thread-safe type whose values can be shared across arbitrary concurrent contexts without introducing a risk of data races.
developer.apple.com
https://medium.com/delightroom/swift-concurrency-2%ED%83%84-sendable-05c7a33a003b
Swift Concurrency 2탄: Sendable
Sendable을 활용한 안전한 데이터 공유
medium.com