我正在使用 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或如果不是 None ,其中包含我可以解釋的錯誤。但是沒有程式在沒有錯誤訊息的情況下退出。
除了直接問題是什么問題之外,還有什么除錯方法可以用來理解 tokio 中發生的事情?
uj5u.com熱心網友回復:
您的程式在write.send(...)未來產生結果后退出。這個結果被丟棄,所以它不會影響你程式的退出代碼。
編譯器實際上會針對未使用的結果發出警告,暗示您應該處理它。
如果你想冒泡你寫操作的錯誤狀態,你可以unwrap()通過它回傳的結果。如果寫入底層 WebSocket 失敗,您的程式將恐慌并退出。
如果寫操作成功并且你想等待讀操作,你需要將JoinHandle回傳的 by系結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如果底層任務慌了,這將是如果讀操作失敗的情況下未來會回傳一個錯誤。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/368498.html
下一篇:并行檔案下載損壞
