как реализовать таймауты - PullRequest
0 голосов
/ 31 мая 2019

Как в Rust можно реализовать тайм-ауты, чтобы предотвратить ожидание результата, и вместо этого по истечении N сделайте некоторую другую логику, например, чтобы дать более точное представление о том, что я хотел бы хотел бы достичь, в Go я мог бы использовать что-то вроде этого select & time.After:

https://play.golang.org/p/sJum9DANJvR

package main

import "time"

func main() {
    ch := make(chan struct{})

    // run something blocking
    go func() {
        time.Sleep(5 * time.Second)
        ch <- struct{}{}
    }()

    select {
    case <-ch:
        println("task done")

    // timeout after 2 seconds
    case <-time.After(2 * time.Second):
        println("timeout after 2 seconds")
    }
}

Это моя попытка с Rust:

use std::{process::Command, thread, time::Instant};

fn main() {
    let start = Instant::now();

    let task = thread::spawn(|| {
        Command::new("sleep")
            .arg("5")
            .output()
            .expect("failed to execute process");
    });

    // timeout after 2 seconds how ?
    task.join().unwrap();
    println!("{:?}", start.elapsed());
}

Но я упускаю что-то вроде select выражения в Go.

Каковы идиоматические способы реализации этого в Rust?

По предложенной ссылке в комментариях я придумал это:

use std::{process::Command, sync::mpsc, thread, time::Duration};

fn main() {
    let (tx, rx) = mpsc::channel();
    thread::spawn(move || {
        match tx.send(
            Command::new("sleep")
                .arg("300")
                .output()
                .expect("failed to execute process"),
        ) {
            Ok(()) => {} //everythin ok
            Err(_) => {} // have been released, don't panic
        }
    });

    let ok = rx.recv_timeout(Duration::from_secs(5));
    println!("{:?}", ok);
}

Хотите знать, если сейчас использовать mpsc::channel(); это путь?

...