有界 vs 无界通道 (Bounded vs unbounded channels)
到目前为止我们都在使用无界通道。
你想发多少消息都行,通道会自己增长以容纳它们。
在多生产者单消费者场景里,这可能有问题:如果生产者入队消息的速率比消费者处理的速率更快,通道会持续增长,可能消耗光所有可用内存。
我们的建议是:在生产系统里永远不要使用无界通道。
你应当总是用有界通道 (bounded channel) 对可入队的消息数量设置上限。
有界通道 (Bounded channels)
有界通道有固定容量。
可以通过用大于零的容量调用 sync_channel 来创建一个:
use std::sync::mpsc::sync_channel;
let (sender, receiver) = sync_channel(10);
receiver 类型同前,依然是 Receiver<T>。
sender 这次是 SyncSender<T> 实例。
发送消息 (Sending messages)
通过 SyncSender 发送消息有两种不同的方法:
send:如果通道有空间,入队消息并返回Ok(())。
如果通道满了,会阻塞并等待直到有可用空间。try_send:如果通道有空间,入队消息并返回Ok(())。
如果通道满了,会返回Err(TrySendError::Full(value)),其中value是没能发送出去的消息。
依据你的用例选择其一。
背压 (Backpressure)
使用有界通道的主要优点是它们提供了一种背压 (backpressure) 形式。
它们强制生产者在消费者跟不上时减速。
背压随后可以在系统中传播,可能影响整个架构,防止终端用户用海量请求把系统压垮。
原文链接:英文原文