gpt4 book ai didi

rust - 为什么我共享的 actix-web 状态有时会重置回原始值?

转载 作者:行者123 更新时间:2023-12-03 11:26:22 27 4
gpt4 key购买 nike

我正在尝试使用 Arc 在 Actix-Web 框架中实现共享状态和 Mutex .下面的代码可以编译,但是当我运行它时,计数器有时会一直回到 0。我如何防止这种情况发生?

use actix_web::{web, App, HttpServer};
use std::sync::{Arc, Mutex};

// This struct represents state
struct AppState {
app_name: String,
counter: Arc<Mutex<i64>>,
}

fn index(data: web::Data<AppState>) -> String {
let mut counter = data.counter.lock().unwrap();
*counter += 1;
format!("{}", counter)
}

pub fn main() {
HttpServer::new(|| {
App::new()
.hostname("hello world")
.register_data(web::Data::new(AppState {
app_name: String::from("Actix-web"),
counter: Arc::new(Mutex::new(0)),
}))
.route("/", web::get().to(index))
})
.bind("127.0.0.1:8088")
.unwrap()
.run()
.unwrap();
}

最佳答案

HttpServer::new接受一个为运行服务器的每个线程调用的闭包。这意味着 AppState 的多个实例被创建,每个线程一个。根据响应 HTTP 请求的线程,您将获得 data 的不同实例。因此不同的计数器值。

为了防止这种情况发生,创建 web::Data<AppState>在闭包之外并在 HttpServer::new 内使用克隆引用关闭。

关于rust - 为什么我共享的 actix-web 状态有时会重置回原始值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59276996/

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