Swift 并发中的"任务"和"参与者"之间的关系是什么



我们都知道:Task.init创建一个运行在当前参与者上的非结构化任务,Task.detached创建一个不属于当前参与者的非结构化任务。

当创建一个新的非结构化任务的上下文是在主参与者或任何其他参与者上时,我理解这些差异,但是它是在并发执行器上而不是在串行执行器上(这意味着一个参与者)。在这种情况下,Task.initTask.detached有什么区别?

一个Task确实有机会不运行在任何演员,对吗?

任务的区别是什么?init和Task.detached?

  1. Task.detached-分离的任务不继承任务本地值

From doc for@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
}
  1. Task.detached-分离的任务不继承父任务的优先级。可以在Task.detached呼叫中设置TaskPriority

除了在使用Task.initTask.detached创建的任务中是否继承actor上下文存在差异之外,还有其他差异:

  1. 使用Task.init创建的任务继承父任务的TaskLocal值。
  2. 使用Task.detached创建的任务不继承任务优先级。优先级需要手工设置,或者默认使用中等优先级。

如果任务不与任何参与者关联,则由并发执行器/并发池执行。所以,任务可能并不总是与actor相关联。

相关内容

  • 没有找到相关文章

最新更新