Отмена оценки в Rust после тайм-аута - PullRequest
1 голос
/ 19 января 2020

У меня есть функция в Rust (которую я не писал), которая либо возвращает в миллисекундах, либо перемалывает в течение ~ 10 минут до сбоя.

Я хотел бы обернуть вызов этой функции во что-то, что возвращает Option, равное None, если для запуска требуется более 10 секунд, и содержит результат, если для запуска потребовалось меньше времени. Однако я не смог найти способ прервать оценку этой функции после ее вызова.

Например:

// This is the unpredictable function
fn f() {
    // Wait randomly for between 0 and 10 seconds
    let mut rng = rand::thread_rng();
    std::thread::sleep(std::time::Duration::from_secs(rng.gen_range(0, 10)));
}

fn main() {
    for _ in 0..100 {
        // Run f() here but so that the whole loop takes no more than 100 seconds
        // by aborting f() if it takes longer than 1 second
    }
}

Я нашел несколько методов, которые могли бы работать использование фьючерсов с таймаутами, но я бы хотел минимизировать накладные расходы, и я не уверен, насколько дорого будет создавать будущее для каждого вызова этой функции, учитывая, что она будет вызываться так много раз.

Спасибо

1 Ответ

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

Затраты на асинхронное выполнение, вероятно, будут минимальными, тем более что ваша функция выполняется по крайней мере за миллисекунды, что уже очень медленно.

Примерно так будет работать:

use rand::Rng;
use std::time::Duration;
use tokio::time::timeout;

async fn f() -> i32 {
    // Wait randomly for between 0 and 10 seconds
    let mut rng = rand::thread_rng();
    tokio::time::delay_for(Duration::from_secs(rng.gen_range(0, 10))).await;
    // return something
    1000
}

#[tokio::main]
async fn main() {
    for _ in 0..100 {
        if let Ok(result) = timeout(Duration::from_secs(1), f()).await {
            println!("result = {}", result);
        } else {
            // took too long
        }
    }
}

Как и в случае с производительностью, если вы обеспокоены тем, что один конкретный подход может быть медленным, проверьте теорию, а не предполагайте, что вы правы. Рабочие характеристики часто могут быть неожиданными.

...