gpt4 book ai didi

multithreading - sync::mpsc 意外关闭 channel

转载 作者:行者123 更新时间:2023-11-29 08:35:22 24 4
gpt4 key购买 nike

我有一个闭包,它使用 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,所以我希望 channel 应该保持事件状态。但 channel 实际上正在关闭,为什么会发生这种情况?

最佳答案

这种情况的一种可能性是您的 Receiver 已被删除。只有当 SenderReceiver 都处于事件状态时, channel 才会保持事件状态。

Sender.send 的示例之一表明放下 Receiver 会终止 channel :

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 存在时一直存在,并且您不应该看到此错误。

关于multithreading - sync::mpsc 意外关闭 channel ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44082408/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com