std::sync::mpsc,为什么crossbeam又要搞出一套channel呢?首先我们来看看标准库中的channel有哪些不足吧Sync。select语句一起使用,但是标准库中的channel并不支持selectMutex<VecDeque<T>>,性能比Go语言的channel还差Mutex<VecDeque<T>>产生的瓶颈么,这里也类似。对于1-3点:(在此之前我们先简单讲下如何创建crossbeam的channel)use crossbeam_channel::bounded;
// 创建一个容量是5的channel
let (s, r) = bounded(5);
// 5条消息之内都不会阻塞
for i in 0..5 {
s.send(i).unwrap();
}
// 超过5条就会阻塞了
// s.send(5).unwrap();
use crossbeam_channel::unbounded;
// 创建一个无限容量的channel
let (s, r) = unbounded();
// 不会阻塞
for i in 0..1000 {
s.send(i).unwrap();
}
use std::thread;
use crossbeam_channel::bounded;
let (s1, r1) = bounded(0);
let (s2, r2) = (s1.clone(), r1.clone());
// 起一个线程先接受一个消息然后发出一个消息
thread::spawn(move || {
r2.recv().unwrap();
s2.send(2).unwrap();
});
// 发送一个消息然后接受一个消息
s1.send(1).unwrap();
r1.recv().unwrap();
Syncuse std::thread;
use crossbeam_channel::bounded;
use crossbeam_utils::thread::scope;
let (s, r) = bounded(0);
scope(|scope| {
// 起一个线程先接受一个消息然后发出一个消息
scope.spawn(|_| {
r.recv().unwrap();
s.send(2).unwrap();
});
// 发送一个消息然后接受一个消息
s.send(1).unwrap();
r.recv().unwrap();
}).unwrap();
select宏,支持使用default分支处理超时等逻辑use std::thread;
use std::time::Duration;
use crossbeam_channel::unbounded;
let (s1, r1) = unbounded();
let (s2, r2) = unbounded();
thread::spawn(move || s1.send(10).unwrap());
thread::spawn(move || s2.send(20).unwrap());
select! {
recv(r1) -> msg => assert_eq!(msg, Ok(10)),
recv(r2) -> msg => assert_eq!(msg, Ok(20)),
default(Duration::from_secs(1)) => println!("timed out"),
}
原文作者:Rust语言中文社区;如有侵权,请联系管理员删除。