[英]Panic running async code while dropping Rust Future
我有一個使用#[tokio::main]
的應用程序,它在其中一項任務中在 AWS 上創建了多個資源。 我已經在Drop
處理程序中實現了清理這些資源。 然而,這些清理函數是異步的,所以我使用block_on
來確保它們在從drop
返回之前同步運行。
use futures::executor::block_on;
struct EventQueue(pub String);
impl Drop for EventQueue {
fn drop(&mut self) {
block_on(delete_queue(&self.0))
}
}
pub async fn delete_queue(queue_url: &str) {
let sqs = rusoto_sqs::SqsClient::new(REGION);
sqs.delete_queue(DeleteQueueRequest {
queue_url: queue_url.to_string(),
})
.await
.unwrap();
}
main
函數直到signal::ctrl_c().await.unwrap();
才返回signal::ctrl_c().await.unwrap();
完成,之后我認為 Tokio 運行時被刪除,並且產生的任務被取消。 我相信與block_on
的交互失敗,因為運行時不再可用。
這是恐慌輸出。
實現異步析構函數非常棘手, 這里已經做了一些工作,但不運行drop
不被視為錯誤, “不調用析構函數就退出” 。
我發現使用tokio::select!
在東京 0.2.11。 防止了恐慌,並有預期的行為。 我想因為select!
在運行時超出范圍之前取消其他期貨。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.