swift 从无任务上下文创建常规或分离任务的区别?

prdp8dxp  于 2024-01-05  发布在  Swift
关注(0)|答案(1)|浏览(160)

当在无任务上下文中创建Task时(例如,从一些随机的AppKit代码),创建分离任务和常规任务之间有区别吗?例如,调用

  • Task.detached
  • Task.init

由于任务没有继承的参与者,我认为这两个调用必须是等效的,或者仍然需要考虑实现差异?

h22fl7wq

h22fl7wq1#

首先,需要注意的是,这两种方法都不会创建子任务。子任务是由结构化并发结构(如async let、任务组等)创建的,而不是像Task.initTask.detached这样的非结构化并发。
[...]要创建一个在当前actor上运行的非结构化任务,调用Task.init(priority:operation:)初始化器。要创建一个不属于当前actor的非结构化任务,更具体地说是一个分离任务,调用Task.detached(priority:operation:)类方法。
这也记录在Task.init中(我的粗体)
代表当前参与者将给定的非抛出操作作为新的顶级任务的一部分异步执行。
您也可以看到这一点-由async let创建的子任务在其父任务被取消时也会被取消,但由Task.init创建的任务则不会。

  1. let task = Task {
  2. let notChild = Task {
  3. await Task.sleep(1_000_000_000)
  4. if !Task.isCancelled {
  5. print("Not Child!")
  6. } else {
  7. print("Child!")
  8. }
  9. }
  10. }
  11. task.cancel()
  12. // prints "Not Child!"

个字符
无论如何,回到你的问题,那么Task.initTask.detached之间到底有什么区别呢?我在回答中的第一句话就提到了这一点,在Task.init的文档中也提到了这一点:
Task.detached(priority:operation:)类似,此函数创建一个单独的顶级任务。与Task.detached(priority:operation:)不同,Task.init(priority:operation:)创建的任务继承了调用者的优先级和actor上下文,因此操作更像是同步操作的异步扩展。
从本质上讲,它是关于执行任务的 actor 的,所以即使没有当前任务,但有一个当前actor,Task.initTask.detached仍然会做不同的事情。Task.init将在当前actor上运行任务,而Task.detached将运行与任何actor分离的任务。
标签:https://www.hackingwithswift.com/quick-start/concurrency/whats-the-difference-between-a-task-and-a-detached-task

展开查看全部

相关问题