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

- Name
- bin | Rust & SyncGet
- @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;
});
- 小弟动作:按住 PTT(
send)大喊:“基地,我是 1 号,货发了!” .await:如果中继正忙,小弟就按着 PTT 守听(挂起),不占 CPU,等频道空了再发。
4. 基地值机:抄报与 QRT (Monitoring)
我作为唯一的收听人(rx),坐在总部戴着耳机守听。
while let Some(信号) = rx.recv().await {
// 抄到一个,存一个文件(进冰箱)
}
- 我的动作:我把静噪(Squelch)拉好,在那值机(
recv)。只要喇叭里有动静(Some),我就立马记录。 - QRT (下班):这块儿最玄学!我得先把手里那个原始手咪扔了(
drop(tx)),等全城所有小弟都关机(tx销毁)后,频道里连底噪都没了。 - 结果:耳机里传来
None,我发送 73,收拾天线,准时 QRT 下班!
💡 技术总结:
- 仓库(篮子):是我们要去扫频的频率列表。
- 中继(mpsc):是连通前线小弟和总部的馈线。
- 我是值机员:我不去跑腿,我只负责在总部守听、录入。
结论:仓库给中继供货,中继传回总部,总部录入硬盘。这一套下来,我的爬虫就像一场完美的 Contest(比赛),稳如老狗。
DE BA7LYI, 73!
🦀 进阶:智能指针 Box<T> 允许你将数据明确地存储在堆上。