gpt4 book ai didi

rust - 将可变 Arc 引用传递给 hyper service_fn 处理程序

转载 作者:行者123 更新时间:2023-11-29 08:20:16 25 4
gpt4 key购买 nike

我一直在尝试以下方法

显示的相关导入和代码

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 要求静态生命周期的错误。

代码只更新了相关内容 @ https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=10ea31450e88a122455006760d7fcdd1

最佳答案

Arc 的全部要点是它计算有多少引用,这在它被克隆时发生。传递对 Arc 的引用会破坏这一点。

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

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

通过闭包中的引用传递 Arc 是不可能的,因为您会引用一些立即超出范围的内容。相反, Arc 放入handle:

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

关于rust - 将可变 Arc 引用传递给 hyper service_fn 处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55164529/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com