日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

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

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

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

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

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

讓我們從一個簡單的代碼示例開始,它只適用于Actix,不會產生任何問題:i1128資訊網——每日最新資訊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")}


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

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

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

下面是導致此錯誤的示例代碼:i1128資訊網——每日最新資訊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")}


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

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

下面是用Oneshot用來解決這個問題的示例代碼:i1128資訊網——每日最新資訊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.www897cc.com/showinfo-26-96748-0.html如何解決“Future不能安全地在線程之間發送”的問題?

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

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

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

標簽:
  • 熱門焦點
  • K6:面向開發人員的現代負載測試工具

    K6 是一個開源負載測試工具,可以輕松編寫、運行和分析性能測試。它建立在 Go 和 JavaScript 之上,它被設計為功能強大、可擴展且易于使用。k6 可用于測試各種應用程序,包括 Web
  • 十個簡單但很有用的Python裝飾器

    裝飾器(Decorators)是Python中一種強大而靈活的功能,用于修改或增強函數或類的行為。裝飾器本質上是一個函數,它接受另一個函數或類作為參數,并返回一個新的函數或類。它們通常用
  • JavaScript學習 -AES加密算法

    引言在當今數字化時代,前端應用程序扮演著重要角色,用戶的敏感數據經常在前端進行加密和解密操作。然而,這樣的操作在網絡傳輸和存儲中可能會受到惡意攻擊的威脅。為了確保數據
  • 只需五步,使用start.spring.io快速入門Spring編程

    步驟1打開https://start.spring.io/,按照屏幕截圖中的內容創建項目,添加 Spring Web 依賴項,并單擊“生成”按鈕下載 .zip 文件,為下一步做準備。請在進入步驟2之前進行解壓。圖
  • 拼多多APP上線本地生活入口,群雄逐鹿萬億市場

    Tech星球(微信ID:tech618)文 | 陳橋輝 Tech星球獨家獲悉,拼多多在其APP內上線了“本地生活”入口,位置較深,位于首頁的“充值中心”內,目前主要售賣美食相關的
  • 10天營收超1億美元,《星鐵》比《原神》差在哪?

    來源:伯虎財經作者:陳平安即便你沒玩過《原神》,你一定聽說過的它的大名。恨它的人把《原神》開服那天稱作是中國游戲史上最黑暗的一天,有粉絲因為索尼在PS平臺上線《原神》,怒而
  • 東方甄選單飛:有些鳥注定是關不住的

    作者:彭寬鴻來源:華爾街科技眼‍‍‍‍‍‍‍‍‍‍東方甄選創始人俞敏洪帶隊的“7天甘肅行”直播活動已在近日順利收官。成立后一
  • iQOO Neo8 Pro真機諜照曝光:天璣9200+和V1+旗艦雙芯加持

    去年10月,iQOO推出了iQOO Neo7系列機型,不僅搭載了天璣9000+,而且是同價位唯一一款天璣9000+直屏旗艦,一經上市便受到了用戶的廣泛關注。在時隔半年后,
  • 北京:科技教育體驗基地開始登記

      北京“科技館之城”科技教育體驗基地登記和認證工作日前啟動。首批北京科技教育體驗基地擬于2023年全國科普日期間掛牌,后續還將開展常態化登記。  北京科技教育體驗基
Top 主站蜘蛛池模板: 鹿泉市| 清水县| 双辽市| 安溪县| 曲麻莱县| 蓬莱市| 县级市| 玉屏| 内江市| 九龙县| 濉溪县| 阳泉市| 米脂县| 莒南县| 宝坻区| 东兰县| 博野县| 剑阁县| 门源| 钟山县| 大连市| 汕尾市| 察雅县| 金平| 密云县| 夏津县| 易门县| 吴旗县| 班戈县| 双牌县| 内乡县| 武宣县| 怀远县| 宁城县| 穆棱市| 台南市| 桃园县| 昆山市| 巍山| 鄢陵县| 丰宁|