Rust语言-线程间的消息传递mpsc::Sender

文章目录

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 的消息。

相关推荐
q***72193 分钟前
Y20030018基于Java+Springboot+mysql+jsp+layui的家政服务系统的设计与实现 源代码 文档
android·前端·后端
i***39587 分钟前
ShardingSphere-jdbc 5.5.0 + spring boot 基础配置 - 实战篇
java·spring boot·后端
Elias不吃糖9 分钟前
整合了c++里面常用的STL及其常用API
开发语言·c++·学习·stl
AY呀11 分钟前
DeepSeek:探索AI大模型与开发工具的全景指南
后端·机器学习
E***q53913 分钟前
后端服务限流实现,Spring Cloud Alibaba Sentinel
java·开发语言·sentinel
凡客丶16 分钟前
SpringBoot整合Sentinel【详解】
spring boot·后端·sentinel
林太白26 分钟前
跟着TRAE SOLO全链路看看项目部署服务器全流程吧
前端·javascript·后端
sunbin27 分钟前
安装 Guacamole 实现nvc远程控制
后端
期待のcode32 分钟前
springboot的热部署和静态资源映射规则
java·spring boot·后端
橘子海全栈攻城狮36 分钟前
【源码+文档+调试讲解】实验室耗材管理系统springboot 094
java·开发语言·spring boot·后端·spring