当前位置: 首页 > news >正文

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

文章目录

  • Rust语言-线程间的消息传递mpsc::Sender
    • 标准库std::sync::mpsc
    • 消息通道
    • 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的缩写,既:多发送者,单接收者。

当然,支持多个发送者也意味着支持单个发送者,我们先来看看单发送者、单接收者的简单例子:

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实战举例

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

相关文章:

  • echarts Y轴展示时间片段,series data数据 也是时间片段,鼠标放上去 提示框显示对应的时间片段
  • 【计算机毕业设计】​206校园顺路代送微信小程序
  • 基于S32K144驱动NSD8308
  • 梯度提升决策树(GBDT)的训练过程
  • P10552 [THUPC2024] 警钟长鸣
  • 【安全】Linux Fanotify使用入门
  • 计算机基础学习有多重要?学哪些?如何学?
  • 基于SpringBoot+Vue大学生网络教学平台设计和实现(源码+LW+调试文档+讲解等)
  • mongodb嵌套聚合
  • DataWhale - 吃瓜教程学习笔记(二)
  • 【ThreeJS】Threejs +Vue3 开发基础
  • ASCII 空字符 ‘\0’ ,与空格字符‘ ’
  • 【技巧】Leetcode 201. 数字范围按位与【中等】
  • 定义多个类对象,分别输入和输出各对象中的时间(时:分:秒)
  • Vue82-组件内路由守卫
  • Android优雅地处理按钮重复点击
  • Create React App 使用
  • iOS编译提示和导航提示
  • isset在php5.6-和php7.0+的一些差异
  • Mithril.js 入门介绍
  • Python学习之路16-使用API
  • SpiderData 2019年2月23日 DApp数据排行榜
  • 复杂数据处理
  • 前端相关框架总和
  • 三分钟教你同步 Visual Studio Code 设置
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 跳前端坑前,先看看这个!!
  • 微信小程序设置上一页数据
  • 微信小程序实战练习(仿五洲到家微信版)
  • 线上 python http server profile 实践
  • 在Unity中实现一个简单的消息管理器
  • 2017年360最后一道编程题
  • ​​​【收录 Hello 算法】10.4 哈希优化策略
  • ​如何防止网络攻击?
  • ### RabbitMQ五种工作模式:
  • #职场发展#其他
  • $nextTick的使用场景介绍
  • (003)SlickEdit Unity的补全
  • (3)选择元素——(17)练习(Exercises)
  • (7)svelte 教程: Props(属性)
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (二)延时任务篇——通过redis的key监听,实现延迟任务实战
  • (转)Linux整合apache和tomcat构建Web服务器
  • (转载)深入super,看Python如何解决钻石继承难题
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .NET Core WebAPI中使用swagger版本控制,添加注释
  • .NET/C# 使用反射注册事件
  • .Net环境下的缓存技术介绍
  • .NET性能优化(文摘)
  • /3GB和/USERVA开关
  • @property python知乎_Python3基础之:property
  • [3D游戏开发实践] Cocos Cyberpunk 源码解读-高中低端机性能适配策略
  • [Android] Amazon 的 android 音视频开发文档
  • [Angular] 笔记 9:list/detail 页面以及@Output