如何阻塞直到两个接收器之一有可用数据?
How to block until one of two Receivers has available data?
我是 Rust 的新手,正在尝试使用 std::sync::mpsc
中的 Sender
s 和 Receiver
s 建立单向节点图。现在,当每个节点只有一个父节点和一个子节点时,我可以正常工作,如下所示:
fn run(mut self) {
let parent = self.parent.unwrap();
loop {
match parent.recv() {
Ok(input) => {
self.value = (self.next_value)(input);
match self.kid {
Some(ref k) => { k.send(self.value).unwrap(); },
None => {}
}
},
Err(_) => {}
}
}
}
但我真正想做的是有两个父节点,在其中计算 next_value
函数,并在 either 父节点发送另一个时通知子节点价值。我不能只使用两次阻塞 recv()
方法,使用轮询和非阻塞 try_recv()
调用可能会起作用,但它似乎效率很低。
有更好的方法吗?
您想使用select!()
fn run(mut self) {
// obtain parents
loop {
select! {
resp = parent1.recv() => match resp {...}
resp = parent2.recv() => match resp {...}
}
}
}
如果您有动态数量的接收频道,请使用 mpsc::Select
我是 Rust 的新手,正在尝试使用 std::sync::mpsc
中的 Sender
s 和 Receiver
s 建立单向节点图。现在,当每个节点只有一个父节点和一个子节点时,我可以正常工作,如下所示:
fn run(mut self) {
let parent = self.parent.unwrap();
loop {
match parent.recv() {
Ok(input) => {
self.value = (self.next_value)(input);
match self.kid {
Some(ref k) => { k.send(self.value).unwrap(); },
None => {}
}
},
Err(_) => {}
}
}
}
但我真正想做的是有两个父节点,在其中计算 next_value
函数,并在 either 父节点发送另一个时通知子节点价值。我不能只使用两次阻塞 recv()
方法,使用轮询和非阻塞 try_recv()
调用可能会起作用,但它似乎效率很低。
有更好的方法吗?
您想使用select!()
fn run(mut self) {
// obtain parents
loop {
select! {
resp = parent1.recv() => match resp {...}
resp = parent2.recv() => match resp {...}
}
}
}
如果您有动态数量的接收频道,请使用 mpsc::Select