结论:按运行环境选:同步代码用 crossbeam-channel(功能全、支持 select!,多数场景优于 std);tokio 异步代码用 tokio::sync::mpsc(发送端可 .await 背压);std::sync::mpsc 适合无依赖的简单场景。三者都是 MPSC——多生产者单消费者。
展开:差异要点:1)std mpsc 提供无界 channel() 和有界同步 sync_channel(n),但发送端阻塞语义老旧、Receiver 不能克隆、没有 select。2)crossbeam 的有界 channel 是数组队列,性能和公平性更好,提供 select! 宏同时等待多个 channel,是标准库的"应然形态"。3)tokio mpsc 是有界异步队列,send().await 在满时挂起而非阻塞线程,天然实现背压;另有 broadcast(多消费者)、oneshot(一次性)、watch(保留最新值)等变体覆盖不同模式。易错点:混用同步 channel 和 async——在 async 任务里调用阻塞的 recv() 会卡住整个 worker 线程,应用 tokio::task::spawn_blocking 或选异步 channel。
let (tx, mut rx) = tokio::sync::mpsc::channel::<u32>(100);
tokio::spawn(async move {
for i in 0..3 { tx.send(i).await.unwrap(); }
});
while let Some(v) = rx.recv().await { println!("{v}"); }
追问方向:有界队列为何是背压的关键、flume 等第三方实现的定位。