在不同线程中循环遍历 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;
我正在尝试为 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;