rust 我如何通过一个未来的服务与关闭

mnemlml8  于 2022-12-19  发布在  其他
关注(0)|答案(1)|浏览(152)

我正在构建一个服务器,希望服务到oneshot receiver通知我停止为止。为此,我使用tokios serve_with_shutdown。我的理解是,服务将运行到未来的signal准备就绪为止

pub async fn serve_with_shutdown<F: Future<Output = ()>>(
    self, 
    addr: SocketAddr, 
    signal: F
) -> Result<(), Error>

如何将单脉冲接收器作为信号传递?

serve_with_shutdown(some_addr, receiver);一样直接传递它给我unused implementer of futures::Future that must be used
我试着实现我自己的未来。同样的错误。

pub struct OneShotFut {
    receiver: Mutex<tokio::sync::oneshot::Receiver<()>>,
}

impl Future for OneShotFut {
    type Output = ();

    fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
        let mut rec = self.receiver.lock().unwrap();
        if rec.try_recv().is_err() {
            return Poll::Pending;
        }
        Poll::Ready(())
    }
}

//... 

serve_with_shutdown(some_addr, OneShotFut {
                receiver: Mutex::new(receiver),
            })

我不能等到将来再将ti传递给serve_with_shutdown,因为那样会直接返回()

bf1o4zei

bf1o4zei1#

由于serve_with_shutdown是一个async fn,它返回一个Future,也必须等待:
里面还有一个async fn

serve_with_shutdown((some_addr, OneShotFut {
    receiver: Mutex::new(receiver),
}).await

相关问题