1

我正在尝试arc为 Warp 路由实现共享状态 ()。鉴于此主要功能:

#[tokio::main]
async fn main() {
    let ack_vec: Vec<api::Acknowledgement> = Vec::new();
    let arc = Arc::new(Mutex::new(ack_vec));

    // GET /call/:id
    let call = warp::get()
        .and(warp::path("call"))
        .and(warp::path::param())
        .map({
            let queue = arc.clone(); // clone handle outside move

            move |id: u32| {
                let ack = api::Acknowledgement::new(id);
                let mut queue = queue.lock().unwrap();
                queue.push(ack);
                println!("pushed to queue: {:?}", queue);

                Ok(warp::reply::json(&id))
            }
        });

    let routes = call
        .with(warp::trace::request());

    warp::serve(routes).run(([127, 0, 0, 1], 4000)).await;

    // problem starts here
    loop {
        let queue = arc.clone(); // clone the handle
        let mut queue = queue.lock().unwrap();

        println!("popped from queue: {:?}", queue.pop());
    }
}

现在,如果我点击/call路线,我可以看到它Acknowledgement已添加到队列中。

最后loop应该在添加队列时从队列中弹出每个值。现在它什么也没做。

我尝试将其包装在 a 中tokio::spawn,但仍然没有结果(没有任何内容打印到标准输出)。

我究竟做错了什么?

4

1 回答 1

1

感谢@Stargateur 的评论,我意识到我做错了什么。如果其他人被困在类似的地方,这是一个工作原型。

std::thread::spawn(move || {
    loop {
        let two = std::time::Duration::from_secs(2);
        std::thread::sleep(two);

        let queue = arc.clone(); // clone handle outside move
        let mut queue = queue.lock().unwrap();
        println!("queue: {:?}", queue);

        while let Some(ack) = queue.pop() {
            println!("ack popped: {:?}", ack);
        }
    }
});

warp::serve(routes).run(([127, 0, 0, 1], 4000)).await;
于 2022-01-24T22:48:20.313 回答