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

相关推荐
GoGeekBaird4 小时前
我开源了 BeeWeave,给 AI Agent 搭一个越用越懂你的知识创作台
后端·github
西门吹-禅6 小时前
java springboot N+1问题
java·开发语言·spring boot
第一程序员6 小时前
Rust Agent 子进程执行:Command 之前,先定义输入和超时
python·rust·github
skywalk81637 小时前
设计并实现段言的 C FFI 绑定机制 @Trae
c语言·开发语言·python·编程
犀利豆7 小时前
AI in Harness(四)
人工智能·后端
Hui Baby8 小时前
Spring Security
java·后端·spring
IT笔记8 小时前
【Rust】Rust Match 模式匹配详解
java·开发语言·rust
2zcode8 小时前
免费开源项目文档:基于MATLAB卷积神经网络的口罩佩戴检测系统
开发语言·matlab·cnn
逝水无殇9 小时前
C# 运算符重载详解
开发语言·后端·c#
苏三说技术9 小时前
2026编程圈很火的10个Skills
后端