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

相关推荐
子兮曰4 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰4 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
小羊没烦恼!4 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
爱勇宝4 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
胡写代码4 天前
别再前后端各写一套表单校验了
java·后端
伞伞悦读4 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
大勇前进4 天前
原生 PHP 还是 Laravel?小项目到底要不要上框架
后端
yuzhi_liu4 天前
我用 LangGraph4j 实现 Multi-Agent Supervisor
后端
alsmile4 天前
Node-RED 之外,国产规则引擎的新方案:基于标准语法,Go 先行实现
后端·开源·go
大白804 天前
PHP 内存溢出排查思路:看懂报错日志,精准定位问题
后端