在sync :: mpsc中意外关闭了频道

时间:2017-05-20 05:48:10

标签: multithreading asynchronous rust closures message-queue

我有一个闭包,它使用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,所以我希望频道应该保持活跃状态​​。但是频道实际上已经关闭了,为什么会这样呢?

1 个答案:

答案 0 :(得分:1)

这样做的一种可能性是您的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有效,并且您不应该看到此错误。