AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當前位置:首頁 > 科技  > 軟件

如何解決“Future不能安全地在線程之間發送”的問題?

來源: 責編: 時間:2024-06-27 07:54:06 112觀看
導讀Rust應用程序通常使用異步庫,如Tokio和Actix。這些庫為異步I/O和并行計算等提供了有力的支持。然而,不同的異步庫在一起使用時,有時會出現問題。當在Tokio運行的異步函數中使用Actix client時,可能會發生“error: future

Rust應用程序通常使用異步庫,如Tokio和Actix。這些庫為異步I/O和并行計算等提供了有力的支持。然而,不同的異步庫在一起使用時,有時會出現問題。U6628資訊網——每日最新資訊28at.com

當在Tokio運行的異步函數中使用Actix client時,可能會發生“error: future不能安全地在線程之間發送”的錯誤,這在使用Tokio和Actix庫時是一個常見的問題。今天,我們來看看如何解決這個問題。U6628資訊網——每日最新資訊28at.com

讓我們從一個簡單的代碼示例開始,它只適用于Actix,不會產生任何問題:U6628資訊網——每日最新資訊28at.com

use actix_web::{web, App, HttpResponse, HttpServer};use awc::Client;#[actix_rt::main]async fn main()  {    actix_rt::spawn(async {        HttpServer::new(|| {            App::new()                .service(web::resource("/hello").route(web::get().to(ok)))        })            .bind("127.0.0.1:8080")?            .run()            .await    });    let client = Client::new();    let url = "http://127.0.0.1:8080/hello";    let ret =  client.get(url).send().await.unwrap().body().await.unwrap();    println!("{:?}", ret);}async fn ok() -> HttpResponse {    HttpResponse::Ok()        .content_type("text/html; charset=utf-8")        .body("OK")}


U6628資訊網——每日最新資訊28at.com

在這段代碼中,我們使用Actix創建一個HTTP服務器,并使用Actix client向它發出GET請求。一切都很順利,但是當我們試圖在Tokio運行的異步函數中使用Actix client時,問題就開始了。U6628資訊網——每日最新資訊28at.com

當我們嘗試在Tokio運行時中調用Actix client時,我們會遇到“error: future不能安全地在線程之間發送的錯誤。async block創建的future不是Send。類型 awc::Client 不是Send”。這是因為Actix client不是Send,這意味著它不能在線程之間安全地傳遞。U6628資訊網——每日最新資訊28at.com

下面是導致此錯誤的示例代碼:U6628資訊網——每日最新資訊28at.com

use actix_web::{web, App, HttpResponse, HttpServer};use awc::Client;#[actix_rt::main]async fn main()  {    actix_rt::spawn(async {        HttpServer::new(|| {            App::new()                .service(web::resource("/hello").route(web::get().to(ok)))        })            .bind("127.0.0.1:8080")?            .run()            .await    });    let r = tokio::spawn(async move {        let client = Client::new();        let url = "http://127.0.0.1:8080/hello";        client.get(url).send().await.unwrap().body().await.unwrap()    }).await.unwrap();    println!("{:?}", r);}async fn ok() -> HttpResponse {    HttpResponse::Ok()        .content_type("text/html; charset=utf-8")        .body("OK")}


U6628資訊網——每日最新資訊28at.com

為了解決這個問題并使代碼在Tokio中安全使用,我們可以使用來自Tokio的Oneshot機制。這種機制允許我們封裝Actix client的輸出,并在線程之間安全地傳遞它。U6628資訊網——每日最新資訊28at.com

下面是用Oneshot用來解決這個問題的示例代碼:U6628資訊網——每日最新資訊28at.com

use actix_web::{web, App, HttpResponse, HttpServer};use awc::Client;#[actix_rt::main]async fn main()  {    actix_rt::spawn(async {        HttpServer::new(|| {            App::new()                .service(web::resource("/hello").route(web::get().to(ok)))        })            .bind("127.0.0.1:8080")?            .run()            .await    });      let (sender, receiver) = tokio::sync::oneshot::channel();    actix_rt::spawn(async move {        let client = Client::new();        let url = "http://127.0.0.1:8080/hello";        let _ = sender.send(client.get(url).send().await.unwrap().body().await.unwrap());    });    let r = tokio::spawn(async move {        receiver.await.unwrap()    }).await.unwrap();    println!("{:?}", r);    std::mem::forget(runtime);}async fn ok() -> HttpResponse {    HttpResponse::Ok()        .content_type("text/html; charset=utf-8")        .body("OK")}

本文鏈接:http://www.tebozhan.com/showinfo-26-96748-0.html如何解決“Future不能安全地在線程之間發送”的問題?

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 12306火車購票系統登錄驗證碼的智能校驗機制

下一篇: 轉轉游戲MQ重構:思考與心得之旅

標簽:
  • 熱門焦點
Top