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 已被删除。该频道只会在 SenderReceiver 都处于活动状态时保持活动状态。

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 一样长,你不应该看到这个错误。