Rust - 消息传递

Rust 主要通过通道(Channel)进行消息传递,它基于"共享内存不如传递消息"的理念。Rust 中消息传递的实现方式主要有以下几种:

通道(Channel)

通道是 Rust 标准库提供的消息传递机制,分为同步通道和异步通道。其特点是发送者和接收者可以位于不同线程,实现线程间安全通信。 下面是一个使用同步通道的示例:

rust 复制代码
use std::sync::mpsc; 
use std::thread; 
fn main() { 
    // 创建一个同步通道,返回发送端和接收端 
    let (tx, rx) = mpsc::channel(); 
    // 启动一个新线程 
    thread::spawn(move || { 
        // 发送消息到通道 
        tx.send("Hello from thread!").unwrap(); 
        println!("Message sent"); 
    }); 
    // 主线程接收消息 
    let received = rx.recv().unwrap(); 
    println!("Received: {}", received); 
} 

多生产者单消费者(mpsc)

Rust 标准库提供的 mpsc(Multiple Producers, Single Consumer)通道允许多个发送者向同一个接收者发送消息。 下面是一个多生产者的示例:

rust 复制代码
use std::sync::mpsc; 
use std::thread;
use std::time::Duration; 
fn main() { 
    let (tx, rx) = mpsc::channel(); 
    let tx1 = tx.clone(); // 克隆发送端以创建多个生产者 
    
    // 第一个线程发送消息 
    thread::spawn(move || { 
        tx.send("Message 1").unwrap(); 
        thread::sleep(Duration::from_secs(1)); 
    }); 
    
    // 第二个线程发送消息 
    thread::spawn(move || { 
        tx1.send("Message 2").unwrap();
        thread::sleep(Duration::from_secs(1)); 
    }); 
    
    // 主线程接收消息 
    for received in rx { 
        println!("Got: {}", received); 
        } 
} 

异步通道

在异步编程中,可以使用 tokioasync-std 提供的异步通道。 下面是一个使用 tokio 异步通道的示例:

rust 复制代码
use tokio::sync::mpsc; 
use tokio::time::{sleep, Duration};

#[tokio::main] 
async fn main() { 
    // 创建一个容量为32的异步通道 
    let (tx, mut rx) = mpsc::channel(32); 
    // 启动一个异步任务发送消息 
    tokio::spawn(async move { 
        tx.send("Hello from async task!").await.unwrap(); 
        println!("Async message sent"); 
    }); 
    
    // 主线程接收消息 
    if let Some(msg) = rx.recv().await { 
        println!("Received: {}", msg); 
    } 
} 

所有权转移

Rust 的消息传递涉及所有权转移,这确保了线程安全。当一个值被发送到通道时,其所有权也随之转移,避免了数据竞争。

rust 复制代码
use std::sync::mpsc; 
use std::thread; 
fn main() { 
    let (tx, rx) = mpsc::channel(); 
    let data = vec![1, 2, 3]; 
    // 转移 data 的所有权到新线程 
    thread::spawn(move || { 
        tx.send(data).unwrap(); 
        // 这里无法再使用 data,因为所有权已转移 
    }); 
    // 主线程接收数据并获得所有权 
    let received_data = rx.recv().unwrap(); 
    println!("Received data: {:?}", received_data); 
} 

总结

Rust 的消息传递机制依靠通道实现线程间通信,通过所有权转移保证内存安全,是构建并发系统的重要基础。我们可以根据需求选择同步通道、异步通道或其他第三方库提供的消息传递方式。

相关推荐
对象存储与RustFS2 小时前
RustFS 后台扫描器与自愈调参:五档速度、位腐检测周期与并发上限
后端·rust·开源
q平面人15 小时前
【总工笔记】mindoc平板、桌面端笔记软件,发布到mindoc服务端
rust·tauri·华为平板·mindoc·总工笔记
MC皮蛋侠客17 小时前
Tauri 2.x 系列(九):安全模型——Capabilities、Permissions、Scope 与 CSP
rust·tauri
Source.Liu18 小时前
【Dioxus】Windows 环境下 Rust + Dioxus 安装配置笔记
windows·rust·dioxus
zLLM_Lab1 天前
不装 Python/PyTorch:8.1 MB Rust 程序在 MacBook Air M5 跑多模态大模型
rust
梦醒沉醉1 天前
std1.97.1——result模块细览
rust
Thneonl1 天前
同一资源、不同 ID:多源拓扑的 Identity Resolution
架构·rust
绍磊leo1 天前
【保姆级】dora-rs 一键安装脚本:类ros2的fishros 风格交互菜单 + 国内镜像加速,把坑都替你踩完了
rust·dora-rs
Ramble_Naylor2 天前
只借不占:Rust 的引用与借用
开发语言·rust
k4m7v2pz2 天前
交叉编译 Rust 到 aarch64 Linux 掌机:glibc 版本与 sysroot 重建的完整踩坑记录
rust·glibc·交叉编译·aarch64·zigbuild·sysroot