当传递给actor方法的逃逸闭包继承actor隔离吗?还是它们是非隔离的?
例如:
actor MyActor {
func method(_ closure: @escaping () async -> Void) {
await closure()
}
}
闭包将使用哪种隔离方式进行创建? 在我的简单测试中,似乎闭包在分配时继承了它的上下文隔离。
actor MyActor {
func method(_ closure: @escaping () async -> Void) async {
print("in actor method: ", Thread.current)
await closure()
print("in actor method: ", Thread.current)
}
}
func application(_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
let actor = MyActor()
Task {
print("in task closure: ", Thread.current)
await actor.method {
print("in actor closure: ", Thread.current)
try? await Task.sleep(nanoseconds: 1_000_000_000)
print("in actor closure: ", Thread.current)
}
print("in task closure: ", Thread.current)
}
return true
}
输出:
in task closure: <_NSMainThread: 0x283604380>{number = 1, name = main}
in actor method: <NSThread: 0x283654400>{number = 5, name = (null)}
in actor closure: <_NSMainThread: 0x283604380>{number = 1, name = main}
in actor closure: <_NSMainThread: 0x283604380>{number = 1, name = main}
in actor method: <NSThread: 0x283654400>{number = 5, name = (null)}
in task closure: <_NSMainThread: 0x283604380>{number = 1, name = main}
我知道这并不是做出假设的正确证明,因此我想问:有没有任何建议或声明可以描述异步闭包所获得的隔离性?
@Sendable
使闭包非隔离(意味着它不必在调用者的 actor 上运行)。已更新上面的内容,其中包含来自 SE-0306 的相关摘录。 - Rob