引言
Async/await 是一种编程模式,用于处理异步操作(如网络请求、文件读写或延时任务),让代码看起来像同步代码一样线性易读,同时避免阻塞程序的执行流。它最早在 C# 中流行,后来被多种语言采用,包括 Swift、TypeScript(基于 JavaScript)和 Python。
这份报告基于最新信息(截至 2025 年 7 月)调研 Swift 6、TypeScript 和 Python 的 async/await 机制,重点比较它们的异同。特别关注:
Swift 6 的 async/await 构建在 Swift 5.5 引入的基础上,主要增强了严格并发检查和数据安全。TypeScript 的 async/await 运行在 JavaScript 引擎(如 Node.js)的事件循环上。Python 的 async/await 基于 asyncio 库,也使用事件循环。
报告将先分别介绍每个语言的机制,然后用表格比较异同,最后给出 Demo 代码示例。解释力求通俗易懂,像在和朋友聊天一样,避免专业术语或用简单例子说明。
Swift 6 的 async/await 机制
Swift 6 的 async/await 是 Apple 生态(iOS、macOS 等)中处理并发的现代方式。它从 Swift 5.5 开始引入,Swift 6 加强了“严格并发”模式,确保代码在多线程环境中不会出现数据竞争(比如两个任务同时改同一个变量导致混乱)。
简单比喻:像厨师做饭——await 等菜煮熟时,去洗碗而不是傻站着。
TypeScript 的 async/await 机制
TypeScript 是 JavaScript 的超集,它的 async/await 直接基于 JS(EcmaScript 2017 引入)。常用于 Node.js 或浏览器环境,处理如 HTTP 请求的异步操作。
比喻:像服务员点单——await 等菜上时,去服务其他桌,而不是干等。
Python 的 async/await 机制
Python 的 async/await 从 3.5 引入,基于 asyncio 库。常用于 web(如 FastAPI)或脚本中处理异步 I/O。
比喻:像调度员安排公交——await 等车到时,去安排下一辆。
异同比较
以下表格总结三者的异同。重点突出阻塞、性能和并发位置。
异:
同:
Demo Code 示例
以下给出每个语言的简单 Demo:并发“fetch”两个延时任务(模拟网络)。关注点:
Swift 6 Demo(需 Xcode/Swift 环境运行;这里是代码,假设在 Playground 或 App 中):
import Foundation
func fetchData(delay: UInt64) async -> String {
try? await Task.sleep(nanoseconds: delay * 1_000_000_000)
return "Data fetched after \(delay) seconds"
}
@MainActor
func main() async {
let start = Date()
async let data1 = fetchData(delay: 2) // 并发启动
async let data2 = fetchData(delay: 3)
let results = await [data1, data2]
let end = Date()
print("\(results[0]) and \(results[1])")
print("Total time: \(end.timeIntervalSince(start)) seconds")
}
Task { await main() }
// 预期输出:Data fetched after 2 seconds and Data fetched after 3 seconds\nTotal time: ~3 seconds
// 解释:使用 async let 并发在后台线程运行;不阻塞主线程。性能:总时 ~3s(并发)。位置:多线程,Task 调度。
TypeScript Demo(Node.js 运行;用 ts-node 或编译后):
async function fetchData(delay: number): Promise<string> {
await new Promise(resolve => setTimeout(resolve, delay * 1000));
return `Data fetched after ${delay} seconds`;
}
async function main() {
const start = Date.now();
const promise1 = fetchData(2);
const promise2 = fetchData(3);
const [data1, data2] = await Promise.all([promise1, promise2]);
const end = Date.now();
console.log(`${data1} and ${data2}`);
console.log(`Total time: ${(end - start) / 1000} seconds`);
}
main();
// 预期输出:Data fetched after 2 seconds and Data fetched after 3 seconds\nTotal time: ~3 seconds // 解释:Promise.all 并发;事件循环处理定时器。不阻塞。性能:高效 I/O。位置:单线程循环,setTimeout 由 OS 异步。
Python Demo(已用工具运行验证):
import asyncio
import time
async def fetch_data(delay):
await asyncio.sleep(delay)
return f"Data fetched after {delay} seconds"
async def main():
start = time.time()
task1 = asyncio.create_task(fetch_data(2))
task2 = asyncio.create_task(fetch_data(3))
data1 = await task1
data2 = await task2
end = time.time()
print(f"{data1} and {data2}")
print(f"Total time: {end - start} seconds")
asyncio.run(main())
// 实际输出(工具运行):Data fetched after 2 seconds and Data fetched after 3 seconds\nTotal time: 3.00168776512146 seconds // 解释:create_task 并发协程;sleep 非阻塞。性能:总时 ~3s。位置:单线程循环,asyncio.sleep 异步。
这些 Demo 展示:三者都能并发执行,总时间短(非 5s),证明非阻塞和并发益处。但 Swift 可在多核上并行延时(如果 CPU 重),而其他俩在单线程。
结论
Swift 6 的 async/await 更注重安全和多线程,适合复杂 App;TypeScript 和 Python 类似,事件循环驱动, excels 在 web/I/O,但 CPU 时需小心阻塞。选择取决于场景:需多线程选 Swift,需轻量 I/O 选后两者。性能上,三者都提升并发效率,但有小开销——测试你的具体用例!如果需要更深代码或基准测试,欢迎补充。