Можно ли проверить, готово ли будущее, не затрачивая на это свою продукцию? - PullRequest
2 голосов
/ 06 апреля 2020

Фьючерсы в Rust можно опрашивать без блокировки, чтобы проверить, готово ли будущее (и выполнить некоторую работу в процессе). Имея это в виду, можно ли "проверить", готово ли будущее, без потребления его вывода?

Возможный сценарий

stdin будет опрошен, если есть какие-либо данные, и выполните действие на входе ( детская площадка ):

async fn read_input_if_available() {
    use tokio::io::AsyncReadExt;

    let mut stdin = tokio::io::stdin();

    // if !stdin.ready() {
    //    return;
    // }

    let mut input = String::new();
    let mut buffer = [0_u8; 1024];

    while let Ok(bytes) = stdin.read(&mut buffer).await {
        if let Ok(string) = std::str::from_utf8(&buffer[..bytes]) {
            input.push_str(string);
        }
    }

    // Take action on `input` here
}

Когда код достигнет await, он не будет продолжаться, пока на stdin не будет что-то, даже если я просто ожидал EOF.

, я использовал tokio::io::Stdin, потому что это проще для отдельного примера, но вопрос в целом о фьючерсах Rust.

1 Ответ

3 голосов
/ 06 апреля 2020

Нет, не напрямую. Как и итераторы, фьючерсы и потоки являются однократными: вы можете получить результат poll или poll_next только один раз.

Итераторы имеют метод peekable, а также фьючерсы и потоки. есть аналоги:

...