Swift Concurrency疑问:子Task为何未继承父Task的执行器与优先级?
问题解析:为什么
debug 4运行在非主线程? 你的代码里各个打印的线程差异,核心原因是Swift并发中任务的actor上下文继承规则,具体拆解如下:
debug 1(主线程):最外层Task { @MainActor in ... }显式绑定了MainActor,所以这个任务的所有代码都在主线程执行。debug 2(主线程):这个Task是直接在MainActor的上下文里创建的非结构化任务,根据规则,它会继承当前的MainActor上下文,因此也运行在主线程。debug 3(主线程):Test().test()是在debug 2的MainActor上下文中被调用的,所以test()方法的执行会被调度到MainActor上,因此这个打印在主线程。debug 4(非主线程):关键在这里——test()方法本身没有被@MainActor标注,属于非actor隔离的函数。当你在非actor隔离的函数内部创建普通Task时,这个任务不会继承调用它的外部actor上下文,而是默认使用全局并发执行器(后台线程池)。哪怕test()是在MainActor上下文中被调用的,函数内部的代码本身不属于MainActor的隔离域,所以创建的新任务不会绑定主线程。
如果想让debug 4也运行在主线程,有两种修改方式:
- 给
Test的test()方法标注@MainActor,让函数本身属于MainActor隔离域:struct Test { @MainActor func test() { print("debug 3:", Thread.current) Task { print("debug 4:", Thread.current) } } } - 或者在创建
Task时显式指定MainActor:Task { @MainActor in print("debug 4:", Thread.current) }
内容的提问来源于stack exchange,提问作者Shuaiqing Luo
相关产品推荐
相关产品推荐

