74、有界通道(bounded channels)
有界通道和无界通道
到目前为止,我们一直在使用无界通道。我们想发送多少消息就发送多少消息,通道也会相应增长以容纳这些消息。
在多生产者,单消费者的情况下这可能会产生问题:如果生产者以比消费者处理信息更快的速度发出信息,通道就会不断增长,可能会消耗掉所有可用内存。
建议是,生产系统中绝不要使用无界通道。我们应该始终对使用有界通道可以排队的消息数量设定上限。
有界通道
有界通道可以有一个固定的容量。可以通过sync_channel创建一个容量大于0的有界通道:
use std::sync::mpsc::sync_channel;
let (sender, receiver) = sync_channel(10);
receiver的类型与之前的相同,都是Receiver<T>,sender是SyncSender<T>的实例。
消息发送ing
通过使用SyncSender我们有两个方法可以发送消息:
send:如果通道内有剩余的空间,它将会将消息列队,然后返回OK(())。如果通道已经满了,它将阻塞,并等待空闲的空间。try_send:如果通道内有剩余的空间,它将会将消息列队,然后返回OK(())。如果通道已经满了,它将返回Err(TrySendError::Full(value)),其中value是无法发送的消息。
根据需要,我们可能需要一种,或是另外一种。
Backpressure(背压)
使用有界通道的主要优点是他们提供了一种背压。
如果消费者跟不上,他会强制发送者放慢速度。这种背压可以在系统中传播,并且可能潜在地影响整个架构,防止终端用户的请求压垮系统。
阅读剩余
版权声明:
作者:CN059
链接:https://www.cn059.com/2025/11/18/74%e3%80%81%e6%9c%89%e7%95%8c%e9%80%9a%e9%81%93%ef%bc%88bounded-channels%ef%bc%89.html
文章版权归作者所有,未经允许请勿转载。
THE END
