sync::mpsc 频道意外关闭
Unexpectedly closed channel in sync::mpsc
我有一个闭包,它使用来自 std::sync::mpsc
:
的 Sender
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
,所以我希望频道应该保持活跃。但是通道实际上正在关闭,为什么会这样?
一种可能是您的 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
一样长,你不应该看到这个错误。
我有一个闭包,它使用来自 std::sync::mpsc
:
Sender
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
,所以我希望频道应该保持活跃。但是通道实际上正在关闭,为什么会这样?
一种可能是您的 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
一样长,你不应该看到这个错误。