【发布时间】:2023-01-08 11:08:10
【问题描述】:
我有两个异步函数:get_message 和 get_event。我想在消息到达或事件发生时执行一个操作,并在无限循环中永远执行该操作。
简化的设置如下所示:
use futures::{future::select, future::Either, pin_mut};
impl MsgReceiver {
async fn get_message(&mut self) -> Message { /* ... */ }
}
impl EventListener {
async fn get_event(&mut self) -> Event { /* ... */ }
}
async fn eternal_task(receiver: MsgReceiver, listener: EventListener) -> ! {
let get_msg_fut = receiver.get_message();
pin_mut!(get_msg_fut);
loop {
let get_event_fut = listener.get_event();
pin_mut!(get_event_fut);
match select(get_event_fut, get_msg_fut).await {
Either::Left((ev, r_get_msg_fut)) => {
/* react to the event */
// r_get_msg_fut is not done, how to reuse it in the next iteration?
}
Either::Right((msg, r_get_event_fut)) => {
/* react to the message */
// it's fine to drop get_event_fut here
// the following line causes a double-mut-borrow error on receiver,
// despite receiver isn't borrowed anymore (the old future is completed and dropped)
let new_future = receiver.get_message();
}
};
}
}
我在这里有三个主要问题:
- 当一个事件首先发生时,如何告诉 rust 我想在下一个循环迭代中重用未完成的 get_message future?
- 当一个消息先来时,如何构造一个没有借用错误的新未来?
- 当(2)解决后,如何将新的未来放入同一个固定内存位置并在下一次循环迭代中使用它?
【问题讨论】:
标签: rust async-await future rust-futures