文章目录
Rust语言-线程间的消息传递mpsc::Sender
标准库std::sync::mpsc
官方文档:https://rustwiki.org/zh-CN/std/sync/mpsc/index.html
参考URL: https://course.rs/advance/concurrency-with-threads/message-passing.html
标准库提供了通道std::sync::mpsc
,其中mpsc是multiple producer, single consumer
的缩写,既:多发送者,单接收者。
当然,支持多个发送者也意味着支持单个发送者,我们先来看看单发送者、单接收者的简单例子:
rust
use std::sync::mpsc;
use std::thread;
fn main() {
// 创建一个消息通道, 返回一个元组:(发送者,接收者)
let (tx, rx) = mpsc::channel();
// 创建线程,并发送消息
thread::spawn(move || {
// 发送一个数字1, send方法返回Result<T,E>,通过unwrap进行快速错误处理
tx.send(1).unwrap();
// 下面代码将报错,因为编译器自动推导出通道传递的值是i32类型,那么Option<i32>类型将产生不匹配错误
// tx.send(Some(1)).unwrap()
});
// 在主线程中接收子线程发送的消息并输出
println!("receive {}", rx.recv().unwrap());
}
该模块通过通道提供基于消息的通信,具体定义为以下三种类型:
- Sender
- SyncSender
- Receiver
Sender 或 SyncSender 用于将数据发送到 Receiver。 两个发送者都是可克隆的 (multi-producer),因此许多线程可以同时发送到一个接收者 (single-consumer)。
消息通道
与 Go 语言内置的chan不同,Rust 是在标准库里提供了消息通道(channel),你可以将其想象成一场直播,多个主播联合起来在搞一场直播,最终内容通过通道传输给屏幕前的我们,其中主播被称之为发送者,观众被称之为接收者,显而易见的是:一个通道应该支持多个发送者和接收者。
mpsc::Sender实战举例
rust
pub struct CommitmentStateDiffWorker<B: BlockT, C, H> {
client: Arc<C>,
storage_event_stream: StorageEventStream<B::Hash>,
tx: mpsc::Sender<BlockDAData>,
msg: Option<BlockDAData>,
backend: Arc<mc_db::Backend<B>>,
phantom: PhantomData<H>,
}
CommitmentStateDiffWorker 结构体中包含一个用于发送 BlockDAData 类型消息的异步通道的发送端。这意味着 CommitmentStateDiffWorker 可以通过这个发送端将消息发送到某个异步任务或者其他处理单元,以便进行进一步处理或传递。
mpsc::Sender
是一个异步消息发送器,用于发送类型为 BlockDAData 的消息。