Как прервать ожидание в цикле - PullRequest
3 голосов
/ 30 января 2020

Рассмотрим эту функцию, получающую дейтаграммы от сокета 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, потому что дейтаграммы могут появляться очень часто, и функция никогда не останавливается.

Я нашел пару частичных решений, но они не подходят скважина:

  1. async_std::future::timeout время ожидания Future, но частично заполненное Vec отбрасывается и возвращается только Err
  2. async_std::future::Future::timeout та же история, частичный вывод отбрасывается

На мой взгляд, я должен передать какой-то "тайм-аут" Future внутри этой функции, а в while let я должен await для обоих сокетов и "timeout" Future. Затем, если срабатывает сокет, мы продолжаем, но если срабатывает «тайм-аут», мы возвращаемся из функции. Но я не уверен, как это сделать sh.

1 Ответ

0 голосов
/ 30 января 2020

Вместо времени ожидания на recv_multiple вы можете время ожидания на socket.recv_from внутри recv_multiple. Потребуется пересчитать оставшееся время после каждой итерации. А когда оставшееся время равно 0, вы можете вернуть свой Vec<_>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...