在tokio-tungstenite下一个原因退出
In tokio-tungstenite next cause exit
我正在使用 tokio-tungstenite 访问服务器。
不幸的是,读取操作不起作用,程序以错误代码 0 退出,因此先验没有错误。一个简化的代码(虽然“...”不是我使用的代码)是
use tokio_tungstenite::connect_async;
use futures_util::StreamExt;
use futures_util::SinkExt;
#[tokio::main]
async fn main() {
let url_name = "wss://...";
let (ws_stream, _) = connect_async(url_name).await.unwrap();
let (mut write, mut read) = ws_stream.split();
tokio::spawn(async move {
let ent = read.next().await;
println!("We have ent");
});
write.send(tokio_tungstenite::tungstenite::Message::Text("...".to_string())).await;
}
我期望的错误程序的行为是读取挂起或 ent 是 None 或者如果not None 包含我可以解释的内部错误。但是没有程序在没有错误消息的情况下退出。
除了问题的直接问题,还有什么调试方法可以帮助理解 tokio 中发生的事情?
您的程序在 write.send(...)
未来产生结果后退出。此结果被丢弃,因此它不会影响程序的退出代码。
编译器实际上会针对未使用的结果发出警告,提示您应该处理它。
如果你想冒泡你的写操作的错误状态,你可以unwrap()
它的结果return。如果写入底层 WebSocket 失败,您的程序将崩溃并退出。
如果写操作成功,而你想等待读操作,你需要绑定 JoinHandle
return 由 tokio::spawn
编辑到一个变量并等待它, 即
let handle = tokio::spawn(async move {
let ent = read.next().await.expect("Stream ended").expect("Error while reading");
println!("We have ent");
});
write.send(tokio_tungstenite::tungstenite::Message::Text("...".to_string())).await.expect("Failed to write the message");
handle.await.expect("The read task failed.");
如果底层任务发生恐慌,handle
的未来将 return 出错,如果读取操作失败就会出现这种情况。
我正在使用 tokio-tungstenite 访问服务器。 不幸的是,读取操作不起作用,程序以错误代码 0 退出,因此先验没有错误。一个简化的代码(虽然“...”不是我使用的代码)是
use tokio_tungstenite::connect_async;
use futures_util::StreamExt;
use futures_util::SinkExt;
#[tokio::main]
async fn main() {
let url_name = "wss://...";
let (ws_stream, _) = connect_async(url_name).await.unwrap();
let (mut write, mut read) = ws_stream.split();
tokio::spawn(async move {
let ent = read.next().await;
println!("We have ent");
});
write.send(tokio_tungstenite::tungstenite::Message::Text("...".to_string())).await;
}
我期望的错误程序的行为是读取挂起或 ent 是 None 或者如果not None 包含我可以解释的内部错误。但是没有程序在没有错误消息的情况下退出。
除了问题的直接问题,还有什么调试方法可以帮助理解 tokio 中发生的事情?
您的程序在 write.send(...)
未来产生结果后退出。此结果被丢弃,因此它不会影响程序的退出代码。
编译器实际上会针对未使用的结果发出警告,提示您应该处理它。
如果你想冒泡你的写操作的错误状态,你可以unwrap()
它的结果return。如果写入底层 WebSocket 失败,您的程序将崩溃并退出。
如果写操作成功,而你想等待读操作,你需要绑定 JoinHandle
return 由 tokio::spawn
编辑到一个变量并等待它, 即
let handle = tokio::spawn(async move {
let ent = read.next().await.expect("Stream ended").expect("Error while reading");
println!("We have ent");
});
write.send(tokio_tungstenite::tungstenite::Message::Text("...".to_string())).await.expect("Failed to write the message");
handle.await.expect("The read task failed.");
如果底层任务发生恐慌,handle
的未来将 return 出错,如果读取操作失败就会出现这种情况。