和这个是一样的 question 但使用活性氧。 我有多个线程经常读取,而另一个线程每天写入一次。只要内存得到更新,读者就不必真正关心数据的旧副本还是新副本
use serde::Serialize; use actix_web::{HttpServer, Responder, get, App, HttpResponse, web}; #[derive(Serialize)] struct MyStruct { a: String, b: Vec<String>, } #[get("get")] async fn get(data: web::Data<MyStruct>) -> impl Responder { return HttpResponse::Ok().json(data); } //not an actual route #[get("set")] async fn set(data: web::Data<MyStruct>) -> impl Responder { //set data to some value // return HttpResponse::Ok(); } #[tokio::main] async fn main() -> std::io::Result<()> { let data = web::Data::new(MyStruct::default()); HttpServer::new(move || { App::new() .app_data(data.clone()) .service(get) .service(set) }).bind(("0.0.0.0", 8080))? .run() .await }
我假设您不想使用Mutex的原因是,这不允许多个线程同时读取值,这将有效地使该路由具有单线程路由的性能。
要一次允许多个读取器,但一次只能允许一个编辑器,可以使用 RwLock 。这仍然会使您的线程在一个线程更新数据时无法读取,但由于这种情况每天只发生一次,我认为这可能是可以接受的。
(你也真的不想在数据发生变化时允许读取,因为你可能会得到各种奇怪的部分更新或损坏的数据,尤其是对于更复杂的数据结构)。