Рассмотрим эту функцию, получающую дейтаграммы от сокета 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(String::from_utf8_lossy(&buf[..amt]).to_string());
}
v
}
И затем она выполняется, например, следующим образом:
let fut = recv_multiple(&socket);
async_std::task::block_on(fut);
Как добавить функцию тайм-аута, чтобы точно после 1 минута Vec<String>
(пусто или нет) возвращается из recv_multiple
? Мне нужно собрать входящие датаграммы за минуту, а затем вернуть то, что было захвачено за это время. Обратите внимание, что мне не нужно тайм-аут одной операции recv_from
, потому что дейтаграммы могут появляться очень часто, и функция никогда не останавливается.
Я нашел пару частичных решений, но они не подходят скважина:
async_std::future::timeout
время ожидания Future
, но частично заполненное Vec
отбрасывается и возвращается только Err
-
async_std::future::Future::timeout
та же история, частичный вывод отбрасывается
На мой взгляд, я должен передать какой-то "тайм-аут" Future
внутри этой функции, а в while let
я должен await
для обоих сокетов и "timeout" Future
. Затем, если срабатывает сокет, мы продолжаем, но если срабатывает «тайм-аут», мы возвращаемся из функции. Но я не уверен, как это сделать sh.