学习rust之实现协程通信
- 作者:
- 淡白
- 创建时间:
- 2023-03-09 18:35:56
- rust
摘要:这段代码是一个使用Tokio库实现的生产者-消费者模型的示例。代码中定义了两个函数`producer`和`consumer`,分别代表生产者和消费者。生产者函数会循环发送数字0到9到通道中,并模拟耗时操作。消费者函数会循环接收通道中的数据,并打印接收到的数字。在主函数中,通过`tokio::spawn`函数创建了两个任务,分别执行生产者和消费者函数。任务会在后台异步执行,然后通过`await`关键字等待任务完成。最后,通过使用`mpsc::channel`函数创建了一个通道,用于生产者和消费者之间的通信。
main.rs
:
use std::sync::mpsc; // 引入 mpsc 库,用于实现通道通信
use std::thread; // 引入 thread 库,用于模拟耗时操作
use std::time::Duration; // 引入 Duration 类型,用于模拟耗时操作的时间
async fn producer(tx: mpsc::Sender<i32>) {
// 定义生产者函数,它接受一个通道发送器
for i in 0..10 {
// 生产者循环发送 0 到 9 的数字
thread::sleep(Duration::from_millis(500)); // 模拟耗时操作
tx.send(i).unwrap(); // 将数字发送到通道中
}
}
async fn consumer(rx: mpsc::Receiver<i32>) {
// 定义消费者函数,它接受一个通道接收器
loop {
match rx.recv() {
// 消费者循环接收通道中的数据
Ok(i) => println!("Received {}", i), // 如果接收成功,打印接收到的数字
Err(_) => break, // 如果接收失败,跳出循环
}
}
}
#[tokio::main]
async fn main() {
// 定义主函数
let (tx, rx) = mpsc::channel(); // 创建一个通道,返回一个发送器和接收器
let producer_task = tokio::spawn(async move {
// 创建一个生产者任务,它接受一个异步闭包
producer(tx).await; // 在异步闭包中调用生产者函数
});
let consumer_task = tokio::spawn(async move {
// 创建一个消费者任务,它接受一个异步闭包
consumer(rx).await; // 在异步闭包中调用消费者函数
});
producer_task.await.unwrap(); // 等待生产者任务完成,并检查是否出现错误
consumer_task.await.unwrap(); // 等待消费者任务完成,并检查是否出现错误
}
Cargo.toml
:
[package]
name = "myrust"
version = "0.1.0"
edition = "2021"
[dependencies]
tokio = { version = "1.26.0", features = ["full"] }