在不同线程中循环遍历 arc 和 pop 值

Loop through arc and pop values in different thread

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

#[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 应该在添加时从队列中弹出每个值。现在它什么都不做。

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

我做错了什么?

感谢@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;