簡體   English   中英

在刪除 Rust Future 時恐慌運行異步代碼

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM