煮咖啡里的大学问:用RustAsync/Await告诉你如何边烧水边磨豆你是否曾经想过,为什么有些程序在处理多个任务时会“卡住”?就像煮咖啡时,必须等水完全烧开才能去磨豆子一样,传统的同步代码一步步执行,效率低下。在追求高性能的今天,这显然无法满足我们的需求。本文将带你走进Rust的异步
你是否曾经想过,为什么有些程序在处理多个任务时会“卡住”?就像煮咖啡时,必须等水完全烧开才能去磨豆子一样,传统的同步代码一步步执行,效率低下。在追求高性能的今天,这显然无法满足我们的需求。本文将带你走进 Rust 的异步世界,通过三个由浅入深的实战示例,从最基础的同步逻辑,到 async/await
语法,再到利用 tokio::join!
实现真正的并发,让你亲手揭开 Rust 高性能并发编程的神秘面纱。
cargo new async_await_demo
Creating binary (application) `async_await_demo` package
note: see more `Cargo.toml` keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
cd async_await_demo
Cursor
编辑器打开项目cc # open -a cursor .
#![allow(unused)]
// Async / await
fn g1() -> u32 {
1
}
fn g2() -> u32 {
2
}
fn g3() -> u32 {
3
}
// Make coffee
fn f() {
// Boil water
let a = g1();
// Grind coffee beans
let b = g2();
// Pour hot water on coffee grinds
let c = g3();
}
fn main() {
f();
}
这段代码展示了一个基本的 同步 执行流程。程序从 main
函数开始,调用了 f
函数。在 f
函数内部,它模拟了“制作咖啡”的三个步骤:它首先调用 g1
函数(如同“烧水”),然后调用 g2
函数(如同“磨咖啡豆”),最后调用 g3
函数(如同“冲泡”)。最关键的一点是,这些函数调用是 按顺序依次执行 的:g2
必须等到 g1
完成后才能开始,而 g3
必须等到 g2
完成。整个过程就像一条单行道,所有任务排队等待,一个接一个地完成。
#![allow(unused)]
// Async / await
async fn g1() -> u32 {
println!("g1 function called");
1
}
async fn g2() -> u32 {
println!("g2 function called");
2
}
async fn g3() -> u32 {
println!("g3 function called");
3
}
// Make coffee
async fn f() -> (u32, u32, u32) {
println!("f function called");
// Boil water - returns Future
let a = g1().await;
// Grind coffee beans
let b = g2().await;
// Pour hot water on coffee grinds
let c = g3().await;
(a, b, c)
}
#[tokio::main]
async fn main() {
let (a, b, c) = f().await;
println!("Coffee is ready: {} {} {}", a, b, c);
}
这段代码展示了 异步 (asynchronous) 编程的基本用法。...
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!