[숙제] TaskLocal proposal 읽기

👋 들어가기 전
두번 쨰 스터디 숙제는 바로 TaskLocal이다.
구조화된 동시성에서 우리는 3가지 부모작업에서 상속받는다고 알고 있다.
- Task 우선순위
- Actor isolated
- Task Local
이 때, Task Local도 여기에 포함되는데, 한번 proposal을 읽어보며 알아보자.
🏁 학습할 내용
- 소개
- Task Local과 같은 개념이 이미 사용되고 있었다 ?
- 선언 및 특징
🖐️소개
Swift가 비동기 함수와 actor 개념을 도입하면서, Swift코드 내의 비동기 함수는 점점 증가하는 모습이다.
동시에 비동기코드를 디버깅, 추적, 계측하는 필요성도 높아지는 상황에서,
thread-local 또는 queue-specific values 같은 기존 도구들은
Task중심의 동시성 모델과 호환 지원이 되지 않는다.
첫번 째로는 너무 위험하다.
사용해보지 않아, 정확한 상황은 모르지만, 필자에 말에 따르면, 태스크에 정보를 연결하고,
종단지점을 넘어 정보를 전달했는데, 이 방식은 너무 위험한 방식이라고 한다.
잘못 다루면, Task 완료 후, 메모리에서 해제되지 않는다고 한다.
Swift가 지향하는 구조적 동시성 철학과 맞지 않다.
thread-lcaol 같은 방식은 본질적으로 비구조적이다.
이런 문제들로 인해, Task Local 개념이 등장하게 되었다.
Task Local은 Task 안에서만 유효하며, Task의 수명보다 오래지속 될 수 없다.
덕분에 thread-local 같은 비구조적 도구에서 생기는 문제를 해결하고 구조적 동시성모델과도 잘 맞는다.
📮Task Local과 같은 개념이 이미 사용되고 있었다 ?
기존 Task 메타데이터
- 이미 Task는 우선순위(Task.currentPriority), 취소(Task.iscanceled) 같은 정보를 carry하고 있음.
- 이 덕분에 부모/자식 태스크 간 전파가 가능함.
Task Local Values의 개념
- 우선순위 및 취소 전파와 같은 방식으로 Task에 추가적인 메타데이터를 붙일 수 있는 API 제공.
- 라이브러리/계측 도구에서 활용 가능.
사용 범위
- Task 내부에서 실행 중인 함수라면 비동기/동기 구분 없이 접근 가능.
- Task가 없는 컨텍스트에서도 사용 가능하지만, 이때는 thread-local처럼 동작. (thread 안에서만 공유됨)
- 그렇게 떄문에, pthread 같은 비구조적 스레드에는 자동 전파 불가.
- 하지만 Task API(async {} 등)로 만든 태스크는 task-local 값을 상속받음.
🪛 선언 및 특징
선언 규칙
- 반드시 static 저장 프로퍼티 + @TaskLocal Property Wrapper사용.
- 전역(global) 프로퍼티는 현재 불가능
- _enclosingInstance 서브스크립트 메커니즘을 확장하여 “enclosing instance가 없어야 한다”는 요구사항을 추가
- 그 결과, 인스턴스 프로퍼티에는 붙이면, 컴파일 시점에 에러 발생
- 기본 값은 보통 Optional타입으로 선언하지만, 필요애 따라 열거형의 .unspecified같은 형태로도 가능
// ❌ 잘못된 코드 (static 사용 안함(instance 프로프티)
enum MyLibrary {
@TaskLocal
var requestID: String?
// error: @TaskLocal declaration 'requestID' must be static.
// Task-local declarations must be static stored properties.
}
// ✅올바른 코드
enum MyLibrary {
@TaskLocal
static var requestID: String?
}
독립성
- 각 @TaskLocal 선언은 완전히 독립된 저장소, 서로 값 공유 불가
- 저장 공간이 Thread(Thread local)에서 Task(Task local)로 이동됨
접근 방식
- 단순히 Static 프로퍼티에 접근과 똑같이 사용할 수 있다
출처
https://github.com/swiftlang/swift-evolution/blob/main/proposals/0311-task-locals.md#motivation
swift-evolution/proposals/0311-task-locals.md at main · swiftlang/swift-evolution
This maintains proposals for changes and user-visible enhancements to the Swift Programming Language. - swiftlang/swift-evolution
github.com