Swift中创建Task后无法立即执行的问题咨询
关于Swift Task执行时机的疑问解答
问题背景
苹果文档提到:
Tasks can start running immediately after creation; you don’t explicitly start or schedule them.
(中文翻译:任务创建后可立即开始运行;无需显式启动或调度。)
但实际测试代码中,Task却在调用函数退出作用域时才执行:
func test() { Task { print("in task") } for _ in 0 ..< 10_000_000 { } print("done counting") }
执行后总是先输出done counting,再输出in task,和预期顺序相反,想知道对文档的理解遗漏了什么。
核心原因:Swift并发的调度规则
你对文档的理解偏差在于**“立即开始”不等于“抢占当前线程立即执行”**。
- Swift的Task基于协作式多任务调度模型,当前正在执行的同步代码(也就是你的
for循环)会优先完成,直到它主动让出CPU控制权(比如遇到await、函数返回、线程休眠等操作),系统才会调度等待中的Task去执行。 - 文档里的“立即开始”指的是Task会被立即加入调度队列等待执行,而不是立刻打断当前正在运行的代码。你的同步循环没有任何让出CPU的操作,所以系统只能等循环结束、
print("done counting")执行完,才会去调度Task里的代码。
如果要验证Task确实是被立即加入队列的,可以在循环里加入await Task.yield()主动让出CPU,这样Task就会被调度执行:
func test() async { Task { print("in task") } for i in 0 ..< 10_000_000 { if i % 1_000_000 == 0 { await Task.yield() } } print("done counting") }
此时大概率会先看到in task输出,因为每次调用Task.yield()都会让系统有机会调度等待中的Task。
内容的提问来源于stack exchange,提问作者rayaantaneja
相关产品推荐
相关产品推荐

