任务局部变量的跨层级传递与隔离
利用TaskLocal实现隐式上下文传递,避免显式参数穿透多层异步调用。 · 难度:入门 · +10XP
任务局部变量的跨层级传递与隔离
TaskLocal允许你在整个任务树中传递值,而无需修改每个函数签名。本教程展示如何构建一个请求追踪系统,每个网络请求生成唯一ID,并通过TaskLocal自动传递到所有子任务、日志和数据库操作中。你还将学习如何正确初始化、修改和读取TaskLocal,以及避免常见的继承陷阱。
@TaskLocal static var requestID: String = ""
func handleRequest() async {
Task {
await $requestID.withValue("req-12345") {
await process()
// 在此任务的所有子任务中,requestID 都是 req-12345
}
}
}
func process() async {
print("当前请求ID: \(requestID)") // 输出 req-12345
await Task.detached {
// 分离任务不继承 TaskLocal,需要重新设置
print("分离任务ID: \(requestID)") // 空字符串
}
}