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

相关推荐
云栖梦泽35 分钟前
鸿蒙应用签名与上架全流程:从开发完成到用户手中
开发语言·鸿蒙系统
神奇的程序员1 小时前
从已损坏的备份中拯救数据
运维·后端·前端工程化
爱上妖精的尾巴1 小时前
6-4 WPS JS宏 不重复随机取值应用
开发语言·前端·javascript
oden2 小时前
AI服务商切换太麻烦?一个AI Gateway搞定监控、缓存和故障转移(成本降40%)
后端·openai·api
李慕婉学姐3 小时前
【开题答辩过程】以《基于Android的出租车运行监测系统设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
java·后端·vue
小鸡吃米…3 小时前
Python 列表
开发语言·python
m0_740043733 小时前
SpringBoot05-配置文件-热加载/日志框架slf4j/接口文档工具Swagger/Knife4j
java·spring boot·后端·log4j
kaikaile19953 小时前
基于C#实现一维码和二维码打印程序
开发语言·c#
我不是程序猿儿3 小时前
【C#】画图控件的FormsPlot中的Refresh功能调用消耗时间不一致缘由
开发语言·c#
rit84324993 小时前
C# Socket 聊天室(含文件传输)
服务器·开发语言·c#