这一期的内容会轻松一些,讲讲crossbeam中的channel。可是有人就要问了在标准库里面已经有了std::sync::mpsc
,为什么crossbeam又要搞出一套channel呢?首先我们来看看标准库中的channel有哪些不足吧
标准库中channel的不足
Receiver不能被clone,是MPSC的channel。理想状况我们希望能有MPMC的channel
Sender和Receiver不是
Sync
。在Go语言中,channel一般和
select
语句一起使用,但是标准库中的channel并不支持select有限容量(Bounded)的channel内部实现就是一个简单的
Mutex<VecDeque<T>>
,性能比Go语言的channel还差有Sender(=Unbouded)和SyncSender(=Bounded)的区分,用起来不统一。
crossbeam中加强版的channel
首先,无论容量是否有限,Sender类型统一成一种,这样用起来就很方便。其次对有限容量的channel进行了重写(还记得上一期我们讲的Deque其实就是为了消除Mutex<VecDeque<T>>
产生的瓶颈么,这里也类似。对于1-3点:(在此之前我们先简单讲下如何创建crossbeam的channel)