我们都知道:Task.init创建了一个运行在当前参与者上的非结构化任务,Task.detached创建了一个不属于当前参与者的非结构化任务。
当创建一个新的非结构化任务的上下文位于主参与者或任何其他参与者上时,我理解这些差异,但是在并发执行者(而不是串行执行器(也就是参与者)上)上会有什么区别呢?在这种情况下,Task.init和Task.detached有什么区别?
Task确实有机会不演任何演员,对吗?
发布于 2022-08-27 09:00:30
除了在使用Task.init和Task.detached创建的任务中是否继承参与者上下文方面存在差异外,还有其他不同之处:
用创建的
TaskLocal值。使用Task.detached创建的如果任务与任何参与者没有关联,则由并发执行器/并发池执行。因此,是的,任务可能并不总是与参与者相关联。
发布于 2022-07-26 08:43:12
Task.init和Task.detached有什么区别?
Task.detached -分离的任务不继承任务-本地值来自@TaskLocal的医生
@TaskLocal
static var traceID: TraceID?
print("traceID: \(traceID)") // traceID: nil
$traceID.withValue(1234) { // bind the value
print("traceID: \(traceID)") // traceID: 1234
call() // traceID: 1234
Task { // unstructured tasks do inherit task locals by copying
call() // traceID: 1234
}
Task.detached { // detached tasks do not inherit task-local values
call() // traceID: nil
}
}
func call() {
print("traceID: \(traceID)") // 1234
}Task.detached -分离的任务不继承父任务的优先级。您可以在TaskPriority调用.中设置
https://stackoverflow.com/questions/73017644
复制相似问题