我有一个闭包,它使用Sender
中的std::sync::mpsc
:
let node = Arc::new(Mutex::new(node_sender));
let switch_callback =
move |p| match Params::parse::<Value>(p) {
Ok(ref v) if v.as_array().is_some() => {
let chain = v.as_array()
.and_then(|arr| arr[0].as_str())
.and_then(|s| Some(s.to_owned()))
.unwrap();
let channel = node.lock().unwrap().clone();
match channel.send(chain.clone()) {
Ok(_) => futures::done(Ok(Value::String(chain))).boxed(),
Err(err) => futures::failed(JsonRpcError::invalid_params(
format!("Node not responding: {}", err.to_string())))
.boxed(),
}
}
Ok(_) | Err(_) => {
futures::failed(JsonRpcError::invalid_params("Invalid chain label for node"))
.boxed()
}
};
此闭包用作另一个线程的回调。我在这里使用了clone()
来克隆Sender
,所以我希望频道应该保持活跃状态。但是频道实际上已经关闭了,为什么会这样呢?
答案 0 :(得分:1)
这样做的一种可能性是您的Receiver
已被删除。只有Sender
和Receiver
都有效时,该频道才会保持有效状态。
Sender.send
的一个示例显示,删除Receiver
会终止频道:
use std::sync::mpsc::channel;
let (tx, rx) = channel();
// This send is always successful
tx.send(1).unwrap();
// This send will fail because the receiver is gone
drop(rx);
assert_eq!(tx.send(1).unwrap_err().0, 1);
只要您的Receiver
成立,就确保Sender
有效,并且您不应该看到此错误。