
本篇带你体验Rust异步世界,基于Tokio运行时,掌握async/await关键语法,高效IO与高并发的解决之道。
需要添加对应的tokio
[package]
name = "my_library"
version = "0.1.0"
edition = "2021"
[dependencies]
tokio = { version = "1", features = ["full"] }
use tokio::time::{sleep, Duration};
#[tokio::main]
async fn main() {
println!("begin");
sleep(Duration::from_secs(1)).await;
println!("end");
}#[tokio::main] 宏会自动启动Tokio运行时,支持 .await 语法。impl Future,通过 .await 让出控制权。use tokio::time::{sleep, Duration};
#[tokio::main]
async fn main() {
let h1 = tokio::spawn(async { sleep(Duration::from_millis(700)).await; "A" });
let h2 = tokio::spawn(async { sleep(Duration::from_millis(300)).await; "B" });
let v = tokio::try_join!(h1, h2).unwrap();
println!("Both joined result: {:?}", v);
}tokio::spawn 用于派发任务到线程池。tokio::join! / try_join! 并发等待多个future全部完成。

use tokio::sync::mpsc;
#[tokio::main]
async fn main() {
let (tx, mut rx) = mpsc::channel(32);
tokio::spawn(async move {
for i in 0..5 {
tx.send(format!("msg-{i}")).await.unwrap();
}
});
while let Some(msg) = rx.recv().await {
println!("got {msg}");
}
}.await。

use tokio::time::{interval, Duration};
#[tokio::main]
async fn main() {
let mut ticks = interval(Duration::from_secs(1));
for _ in 0..5 {
ticks.tick().await;
println!("tick");
}
}
use tokio::net::TcpListener;
use tokio::io::{AsyncReadExt, AsyncWriteExt};
#[tokio::main]
async fn main() -> std::io::Result<()> {
let listener = TcpListener::bind("127.0.0.1:8080").await?;
loop {
let (mut socket, _) = listener.accept().await?;
tokio::spawn(async move {
let mut buf = [0u8; 1024];
loop {
let n = match socket.read(&mut buf).await {
Ok(0) => break,
Ok(n) => n,
Err(_) => break,
};
if socket.write_all(&buf[..n]).await.is_err() {
break;
}
}
});
}
}下一节可选:深入异步原理、unsafe下自定义Future、业务微服务架构与实践。