在 swift 中叫 concurrency.
有同步和异步, 也有串行和并行.
同步是两个任务, 后面的任务需要等待前面的任务完成才会被执行, 如果前面的任务卡住, 也会影响后面的任务不被执行; 如果在主线程(UI 线程)则表现出页面卡住.
相反, 异步的话, 需要两个任务在不同线程执行, 互相不影响.
而串行是一个任务接另一个任务, 比如同步任务就是串行执行, 但异步任务也可以串行执行.
不同线程的任务同时执行叫作并行.
回到你的例子中. 代码执行先打印 "Before calling processData"
接着来到 Task 中执行 processData() 函数打印 "Start processing data", 接着又到了 fetchData() 函数打印 "Start fetching data"; 到目前为止都是串行的, 然后遇到了 await, 这时候是在新的线程中起了一个异步任务. 原来线程(主线程)继续执行, 于是打印 "After calling processData".
等待 Task.sleep 两秒结束后, 继续回到主线程打印 "Data fetching complete", 然后再返回给 processData(), 接着打印 "Data processing complete. Received: \(data)".
协程是另一种东西, 比如 js 中的协程是比线程更小的执行单元, 具体可以学习
https://github.com/tj/co 这个.