关于异步编程的思考
更新于 2026-05-14
技术
异步编程简史
从回调函数到 Promise,再到 async/await,异步编程在不断发展。
JavaScript 的演进
JavaScript
// 回调地狱
getData(function(a) {
getMoreData(a, function(b) {
getEvenMoreData(b, function(c) {
console.log(c);
});
});
});
// async/await
async function main() {
const a = await getData();
const b = await getMoreData(a);
const c = await getEvenMoreData(b);
console.log(c);
}
Rust 的 async
Rust 的 async 设计很特别——它是零开销抽象,没有内建运行时。
Rust
use tokio::time::sleep;
#[tokio::main]
async fn main() {
let handle = tokio::spawn(async {
sleep(std::time::Duration::from_secs(1)).await;
println!("background task done");
});
println!("waiting...");
handle.await.unwrap();
}
对比
语言 | 运行时 | 特点 |
|---|---|---|
JS/TS | Event Loop | 单线程,并发靠异步 |
Rust | Tokio/Smol | 零开销,多线程 |
Python | asyncio | 协程模型 |
Go | Goroutine | 有栈协程,自动调度 |
个人感受
Rust 的 async 学习曲线最陡,但用习惯之后真的很舒服。