当前位置:首页 > 科技  > 软件

如何解决“Future不能安全地在线程之间发送”的问题?

来源: 责编: 时间:2024-06-27 07:54:06 191观看
导读Rust应用程序通常使用异步库,如Tokio和Actix。这些库为异步I/O和并行计算等提供了有力的支持。然而,不同的异步库在一起使用时,有时会出现问题。当在Tokio运行的异步函数中使用Actix client时,可能会发生“error: future

Rust应用程序通常使用异步库,如Tokio和Actix。这些库为异步I/O和并行计算等提供了有力的支持。然而,不同的异步库在一起使用时,有时会出现问题。j4d28资讯网——每日最新资讯28at.com

当在Tokio运行的异步函数中使用Actix client时,可能会发生“error: future不能安全地在线程之间发送”的错误,这在使用Tokio和Actix库时是一个常见的问题。今天,我们来看看如何解决这个问题。j4d28资讯网——每日最新资讯28at.com

让我们从一个简单的代码示例开始,它只适用于Actix,不会产生任何问题:j4d28资讯网——每日最新资讯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")}


j4d28资讯网——每日最新资讯28at.com

在这段代码中,我们使用Actix创建一个HTTP服务器,并使用Actix client向它发出GET请求。一切都很顺利,但是当我们试图在Tokio运行的异步函数中使用Actix client时,问题就开始了。j4d28资讯网——每日最新资讯28at.com

当我们尝试在Tokio运行时中调用Actix client时,我们会遇到“error: future不能安全地在线程之间发送的错误。async block创建的future不是Send。类型 awc::Client 不是Send”。这是因为Actix client不是Send,这意味着它不能在线程之间安全地传递。j4d28资讯网——每日最新资讯28at.com

下面是导致此错误的示例代码:j4d28资讯网——每日最新资讯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")}


j4d28资讯网——每日最新资讯28at.com

为了解决这个问题并使代码在Tokio中安全使用,我们可以使用来自Tokio的Oneshot机制。这种机制允许我们封装Actix client的输出,并在线程之间安全地传递它。j4d28资讯网——每日最新资讯28at.com

下面是用Oneshot用来解决这个问题的示例代码:j4d28资讯网——每日最新资讯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.28at.com/showinfo-26-96748-0.html如何解决“Future不能安全地在线程之间发送”的问题?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 12306火车购票系统登录验证码的智能校验机制

下一篇: 转转游戏MQ重构:思考与心得之旅

标签:
  • 热门焦点
  • 6月安卓手机性价比榜:Note 12 Turbo断层式碾压

    6月份有一个618,虽然这是京东周年庆的日子,但别的电商也都不约而同的跟进了,反正促销没坏处,厂商和用户都能满意。618期间一些产品也出现了历史低价,那么各个价位段的产品性价比
  • 线程通讯的三种方法!通俗易懂

    线程通信是指多个线程之间通过某种机制进行协调和交互,例如,线程等待和通知机制就是线程通讯的主要手段之一。 在 Java 中,线程等待和通知的实现手段有以下几种方式:Object 类下
  • 三言两语说透柯里化和反柯里化

    JavaScript中的柯里化(Currying)和反柯里化(Uncurrying)是两种很有用的技术,可以帮助我们写出更加优雅、泛用的函数。本文将首先介绍柯里化和反柯里化的概念、实现原理和应用
  • 2天涨粉255万,又一赛道在抖音爆火

    来源:运营研究社作者 | 张知白编辑 | 杨佩汶设计 | 晏谈梦洁这个暑期,旅游赛道彻底火了:有的「地方」火了——贵州村超旅游收入 1 个月超过 12 亿;有的「博主」火了&m
  • 新电商三兄弟,“抖快红”成团!

    来源:价值研究所作 者:Hernanderz 随着内容电商的概念兴起,抖音、快手、小红书组成的“新电商三兄弟”成为业内一股不可忽视的势力,给阿里、京东、拼多多带去了巨大压
  • 年轻人的“职场羞耻感”,无处不在

    作者:冯晓亭 陶 淘 李 欣 张 琳 马舒叶来源:燃次元“人在职场,应该选择什么样的着装?”近日,在网络上,一个与着装相关的帖子引发关注,在该帖子里,一位在高级写字楼亚洲金
  • 7月4日见!iQOO 11S官宣:“鸡血版”骁龙8 Gen2+200W快充加持

    上半年已接近尾声,截至目前各大品牌旗下的顶级旗舰都已悉数亮相,而下半年即将推出的顶级旗舰已经成为了数码圈爆料的主流,其中就包括全新的iQOO 11S系
  • 引领旗舰级影像能力向中端机普及 OPPO K11 系列发布 1799 元起

    7月25日,OPPO正式发布K系列新品—— OPPO K11 。此次 K11 在中端手机市场长期被忽视的影像板块发力,突破性地搭载索尼 IMX890 旗舰大底主摄,支持 OIS
  • 世界人工智能大会国际日开幕式活动在世博展览馆开启

    30日上午,世界人工智能大会国际日开幕式活动在世博展览馆开启,聚集国际城市代表、重量级院士专家、国际创新企业代表,共同打造人工智能交流平台。上海市副市
Top