Asynchronous 如何中断等待';成圈
考虑此函数从UDP套接字接收数据报:Asynchronous 如何中断等待';成圈,asynchronous,rust,Asynchronous,Rust,考虑此函数从UDP套接字接收数据报: async fn recv_multiple(socket: &async_std::net::UdpSocket) -> Vec<String> { let mut buf = [0; 1024]; let mut v = vec![]; while let Ok((amt, _src)) = socket.recv_from(&mut buf).await { v.push(St
async fn recv_multiple(socket: &async_std::net::UdpSocket) -> Vec<String> {
let mut buf = [0; 1024];
let mut v = vec![];
while let Ok((amt, _src)) = socket.recv_from(&mut buf).await {
v.push(String::from_utf8_lossy(&buf[..amt]).to_string());
}
v
}
如何添加超时功能,以便在恰好1分钟后从多个接收返回一个Vec
(空或不空)?我需要收集一分钟传入的数据报,然后返回在此期间捕获的内容。请注意,我不需要对来自操作的单个recv_超时,因为数据报可能经常出现,并且函数永远不会超时
我找到了一些局部解决方案,但它们不太合适:
Future
但部分填充的Vec
被丢弃,只返回Err
在我看来,我应该在这个函数和
中传递某种类型的“timeout”Future
,而让在套接字和“timeout”Future
上等待。然后,如果套接字触发,我们继续,但如果“timeout”触发,我们将从函数返回。但是我不知道如何做到这一点。你可以在recv\u multiple
内部recv\u中使用socket.recv\u,而不是在recv\u multiple
上计时。每次迭代后都需要重新计算剩余时间。当剩余时间为0时,您可以返回您的Vec
let fut = recv_multiple(&socket);
async_std::task::block_on(fut);