1

我正在探索将镍RS用于Web应用程序,因此我目前正在编写一些基本程序来复制我已经能够使用python和flask实现的行为。对于这种特定情况,我想跟踪特定路由的请求数量。在 python 中,使用全局变量很容易,并且我假设 Global Interpreter Lock 提供了一些保证,即一次只能由一件事访问该变量(这对于这个特定场景来说不是一个大问题)。然而,在 Rust 中,每次访问计数器时都必须使用相同的操作unsafe,这似乎表明可能有一种安全的方式来实现应用程序状态?

我尝试使用Nickel::with_data(config)where config 是一个包含单个 u64 的结构,并且通过使用 Request 实现的 server_data() 方法,我可以获得计数器的值,但是我设法通过借用写入结构的任何更改server_data() 结构的结果是可变的,但新值在方法调用之间不存在。

我试图适应这里发生的事情。

到目前为止,我设法开始工作的唯一方法是这篇文章中包含的代码。

#[macro_use]
extern crate nickel;

use nickel::{Nickel, HttpRouter};

static mut REQUEST_COUNT: u64 = 0;

fn main() {
    let mut nickel_app = Nickel::new();
    nickel_app.get("/", middleware! {
        unsafe {
            println!("REQUEST_COUNT: {} -> {}", REQUEST_COUNT, REQUEST_COUNT + 1u64);
            REQUEST_COUNT += 1u64;
        }
        "index"
    });
    nickel_app.get("/req", middleware! {
        unsafe {
            format!("REQUEST_COUNT is {}", REQUEST_COUNT)
        }
    });

    match nickel_app.listen("127.0.0.1:8080") {
        Ok(_) => {}
        Err(_) => {
            panic!("Couldn't bind to 127.0.0.1:8080")
        }
    }
}
4

1 回答 1

1

看起来就是我正在寻找的一种访问某种应用程序状态的安全方式。

于 2019-07-12T15:14:09.743 回答