Published on

谁来帮我买菜?—— BA7LYI 的无线电版 Rust 异步 MPSC 通联指南

Authors
  • avatar
    Name
    bin | Rust & SyncGet
    Twitter
    @x

1. 基地台架设:中继与信道 (The Repeater)

今天在撸我的 SyncGet-Tiny 爬虫时,我悟到了:这 Rust 的 mpsc 不就是咱玩的中继台(Repeater)吗?

第一步:架设中继

let (tx, mut rx) = mpsc::channel(32);
  • 我的动作:我在系统里架起了一个中继台
  • 32 (Buffer):这是我设定的信道容量。如果 32 个槽位全占满了,说明频道太挤,后来的兄弟想上台子就得先压沙.await 等待)。
  • TX/RX:这就是异频通讯,发信(tx)和收信(rx)分工明确。

2. 任务分发:分发手咪 (Handhelds)

有了中继,我得派出一堆小弟(Task)去互联网各个山头抄收信号。

let tx_clone = tx.clone();
  • 我的动作:我给每个派出去的小弟都发了一个同频手咪
  • 关键点:手咪(tx)可以无限复刻(.clone()),大家都在同一个频率上呼叫我这个基地台。

3. 呼叫基地:PTT 信号传回 (Push To Talk)

小弟们在远方爬到了网页(抄到了报文),就得呼叫我。

tokio::spawn(async move {
    tx_clone.send("抄收到 HTML 数据").await;
});
  • 小弟动作:按住 PTTsend)大喊:“基地,我是 1 号,货发了!”
  • .await:如果中继正忙,小弟就按着 PTT 守听(挂起),不占 CPU,等频道空了再发。

4. 基地值机:抄报与 QRT (Monitoring)

我作为唯一的收听人(rx),坐在总部戴着耳机守听。

while let Some(信号) = rx.recv().await {
    // 抄到一个,存一个文件(进冰箱)
}
  • 我的动作:我把静噪(Squelch)拉好,在那值机recv)。只要喇叭里有动静(Some),我就立马记录。
  • QRT (下班):这块儿最玄学!我得先把手里那个原始手咪扔了(drop(tx)),等全城所有小弟都关机(tx 销毁)后,频道里连底噪都没了。
  • 结果:耳机里传来 None,我发送 73,收拾天线,准时 QRT 下班!

💡 技术总结:

  1. 仓库(篮子):是我们要去扫频的频率列表。
  2. 中继(mpsc):是连通前线小弟和总部的馈线。
  3. 我是值机员:我不去跑腿,我只负责在总部守听、录入。

结论:仓库给中继供货,中继传回总部,总部录入硬盘。这一套下来,我的爬虫就像一场完美的 Contest(比赛),稳如老狗。


DE BA7LYI, 73!

🦀 进阶:智能指针 Box<T> 允许你将数据明确地存储在堆上。