我正在學習 rust,我想做的事情是殺死或關閉GET /.
這是你不能用warp做的事情嗎?還是我的實作被破壞了?
我有以下代碼,但它似乎不想回應任何 HTTP 請求。
pub async fn perform_oauth_flow(&self) {
let (tx, rx) = channel::unbounded();
let routes = warp::path::end().map(move || {
println!("handling");
tx.send("kill");
Ok(warp::reply::with_status("OK", http::StatusCode::CREATED))
});
println!("Spawning server");
let webserver_thread = thread::spawn(|| async {
spawn(warp::serve(routes).bind(([127, 0, 0, 1], 3000)))
.await
.unwrap();
});
println!("waiting for result");
let result = rx.recv().unwrap();
println!("Got result");
if result == "kill" {
webserver_thread.join().unwrap().await;
}
}
uj5u.com熱心網友回復:
let webserver_thread = thread::spawn(|| async {
// ^^^^^
創建async塊不會執行里面的代碼;它只是創建一個Future你需要的.await。您的服務器從未真正運行過。
一般來說,使用帶有異步代碼的執行緒不會很好地作業。最好使用您的運行時任務,如果warp是tokio,請使用tokio::spawn():
let webserver_thread = tokio::spawn(async move {
spawn(warp::serve(routes).bind(([127, 0, 0, 1], 3000)))
.await
.unwrap();
});
// ...
if result == "kill" {
webserver_thread.await;
}
您可能還發現有必要使用tokio 的異步通道而不是同步通道。
uj5u.com熱心網友回復:
您的代碼中有兩個問題:
- 正如@ChayimFriedman 的回答所指出的,您永遠不會啟動服務器,因為您的異步塊永遠不會運行。
- 即使你用 Tokio 任務替換執行緒,你也永遠不會告訴服務器退出。您需要使用
bind_with_graceful_shutdown以便可以通知服務器退出。
(未經測驗)完整示例:
pub async fn perform_oauth_flow(&self) {
let (tx, rx) = tokio::oneshot::channel();
let routes = warp::path::end().map(move || {
println!("handling");
tx.send(());
Ok(warp::reply::with_status("OK", http::StatusCode::CREATED))
});
println!("Spawning server");
let server = warp::serve(routes)
.bind_with_graceful_shutdown(
([127, 0, 0, 1], 3000)),
async { rx.await.ok(); })
.1;
println!("waiting for result");
server.await;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/491155.html
上一篇:WinEventHook:安裝事件掛鉤的執行緒結束時會發生什么?
下一篇:Java非法監視器狀態例外
