将可变 Arc 引用传递给 hyper service_fn 处理程序时出现问题

2023-12-22

我一直在尝试以下

显示相关导入和代码

use std::sync::{Arc, Mutex};
use std::thread;
use hyper::rt::{self, Future, Stream};
use hyper::service::service_fn;
use hyper::{Body, Request, Response, Server, StatusCode};

pub struct ChallengeState;
pub struct ChallengeResponse;

type BoxFut<'a> = Box<Future<Item = Response<Body>, Error = hyper::Error> + Send + 'a>;

fn handle_challengeproof<'a>(
    req: Request<Body>,
    challenge: &Arc<Mutex<ChallengeState>>,
) -> BoxFut<'a> {
    let resp = req.into_body().concat2().map(move |body| {
        let challenge_lock = challenge.lock().unwrap();
        Response::builder()
        .status(StatusCode::OK)
        .body(Body::from("test"))
        .unwrap()
    });
    Box::new(resp)
}

fn handle<'a>(
    req: Request<Body>,
    challenge: &Arc<Mutex<ChallengeState>>,
) -> BoxFut<'a> {
    handle_challengeproof(req, challenge)
}

pub fn run_listener(
    challenge: Arc<Mutex<ChallengeState>>,
) -> thread::JoinHandle<()> {
    let addr = ([127, 0, 0, 1], 9999).into();

    let listener_service = move || {
        let challenge = Arc::clone(&challenge);
        service_fn(move |req: Request<Body>| {
            handle(req, &challenge)
        })
    };

    let server = Server::bind(&addr)
        .serve(listener_service)
        .map_err(|_| () );

    thread::spawn(move || {
        rt::run(server);
    })
}

我一直试图通过传递对handle方法的引用来避免额外的Arc克隆,但似乎无法解决这个问题。避免handle() 上的生命周期会导致有关 future 要求静态生命周期的不同错误。

仅使用相关内容更新代码@


整个点Arc是它计算有多少引用,这是在克隆时发生的。传递对一个的引用Arc打败了这一点。

不传递引用,而是传递Arc本身。所以handle的签名变为:

fn handle<'a>(
    req: Request<Body>,
    challenge: Arc<Mutex<ChallengeState>>,
) -> BoxFut<'a>

通过Arc通过闭包的引用是不可能的,因为您将引用立即超出范围的内容。反而,move the Arc into handle:

let listener_service = move || {
    service_fn(move |req: Request<Body>| handle(req, challenge))
}; 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将可变 Arc 引用传递给 hyper service_fn 处理程序时出现问题 的相关文章

随机推荐

  • C# 中多线程和异步程序的区别

    我最初在 Stackoverflow 和 google 中搜索了类似类型的问题 只有一个链接给出了一些要点 但我无法清楚地理解 1 https social msdn microsoft com Forums en US 3de8670c
  • 如何以编程方式将程序的 CPU 使用率限制在 70% 以下?

    最近 我在构建程序时变得更加注重健康 我观察到大多数程序需要 2 或 3 分钟才能执行 当我检查任务调度程序时 我发现它们消耗了 100 的 CPU 使用率 可以我在代码中以编程方式限制这种用法 这肯定会让我能够在给定时间运行多个程序 谢谢
  • 一旦按下按钮,Java 键事件就不会执行

    您好 希望有人能告诉我我的关键事件做错了什么 我正在使用卡片布局来浏览我的两个 JPanels atm 为此 我使用操作事件和关键事件 当按下按钮时 动作事件将在 JPanel 之间切换 而当按下按键时 按键事件将隐藏按钮 按键事件一切顺利
  • asp.net MSDeployEnableWebConfigEncryptRule 无法加密 web.config

    我已经添加了
  • Rails:注册后设计登录

    我正在使用 Devise 来实现用户注册 登录 我希望用户注册成功后能够自动登录 我怎样才能做到这一点 可能情况是默认情况下设计这个 但也许我在某个地方禁用了该设置 我不记得了 你必须 1 将用户注册到设备网站 2 登录用户 对于选项 1
  • 无需矢量扫描即可查找给定区间内的值

    带有R包data table是否可以在不对数据进行全矢量扫描的情况下找到给定区间内的值 例如 gt DT lt data table x c 1 1 2 3 5 8 13 21 34 55 89 gt my data table funct
  • 如果我的测试中有验证,期望是否多余?

    我对期望和验证的目的和区别感到困惑 例如 Tested FooServiceImpl fooService Injectable FooDao fooDao Test public void callsFooDaoDelete throws
  • 如何从 MSI 检查产品的已安装版本

    在查看了这个网站上的很多帖子后 我最终决定把我的帖子放上来 我正在使用 Wix 准备 MSI 文件 在安装系统之前 我需要检查是否安装了特定版本的企业产品 我有该产品的 GUID 所有版本都相同 但我需要检查是否安装了 1 10 0 版本
  • Angular ng 选择所需选项

    我无法找到如何使用 ng select 中所需的选项 我已经尝试过这个
  • 贝塞尔曲线在 HTML5 画布中绘制拉伸椭圆

    这种绘制椭圆的方法看起来干净而优雅 http www williammalone com briefs how to draw ellipse html5 canvas http www williammalone com briefs h
  • Rainlendar 如何使用 wxWidgets 实现透明度

    雷恩伦达尔 http www rainlendar net cms index php是一个很棒的跨平台日历程序 是用 wxWidgets 编写的 它是如何实现透明效果的呢 有谁有演示透明效果的示例代码吗 我的猜测是他们可能会使用wxScr
  • dllimport 无法找到 dll,即使它位于 PATH 中

    我使用 Dllimport DllName dll 我确信进程 PATH 环境变量中存在我的 dll 的路径 并且仍然 我收到 找不到 DllName dll 找不到 DllName dll 也可能意味着 DllImport 尚未找到 Dl
  • 删除滚动条但不删除滚动功能[重复]

    这个问题在这里已经有答案了 我知道你可以定义溢出 隐藏 在 HTML 正文上删除滚动条 但我希望仍然能够使用鼠标上的箭头或滚轮滚动 预先感谢您的任何帮助 编辑 感谢您有关悬停滚动条和自定义栏的所有建议 还要感谢您对删除滚动条影响用户体验的所
  • 捆绑包和文件访问

    我已向我的项目添加了一系列文件夹 使用 添加现有文件 选项 这会导致文件夹内容在 Xcode 中显示为蓝色文件夹 以下作品 NSString imageName NSString stringWithFormat File 03 image
  • PowerShell 范围标识符

    我是 PowerShell 新手 试图更好地理解范围 有没有办法从范围内识别范围 某些变量或函数可以给我某种范围名称或范围 Guid 或范围 Id 例如 我如何知道本地范围是否是全局范围 例如 我如何知道本地范围是否是全局范围 bool i
  • 如何验证传递给“PrincipalContext”的凭据

    这是后续我之前的问题 https stackoverflow com questions 50055073 testing a principalcontext using validatecredentialsnull null beha
  • ant 的 componentdef 错误

    我有一个相对较旧的 Grails 应用程序 它使用 ant 来构建应用程序 在测试服务器中 它构建没有任何问题 但是当我尝试在我的电脑上运行它时 我收到一致的错误 Caused by jar file C ant apache ant 1
  • Scala:理解参数多态性

    有什么区别 def drop1 A l List A l tail and def drop1 l List Int l tail 假设用法看起来像 drop1 List 1 2 3 何时应该使用其中之一 为什么 虽然我可以理解第二个例子
  • Swift“文本”不可用:自 iOS7 起已弃用 API。文本标签不起作用

    我一直有这个错误 我已经看到使用 textLabel text 回答了其他问题 但它在我的情况下不起作用 我是 swift 的新手 所以有人可以解释一下为什么以及如何解决这个问题 你需要打开包装textLabel通过使用 after tex
  • 将可变 Arc 引用传递给 hyper service_fn 处理程序时出现问题

    我一直在尝试以下 显示相关导入和代码 use std sync Arc Mutex use std thread use hyper rt self Future Stream use hyper service service fn us