В ожидании списка фьючерсов в Rust - PullRequest
2 голосов
/ 18 октября 2019

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

Вот приблизительный обзор того, что я пытаюсь сделать. В частности, isDone не существует, а также из того, что я могу понять из документов, не обязательно является допустимым способом использования фьючерсов в Rust. Каков идеологический способ делать такие вещи?

use std::collections::HashMap;
use tokio::runtime::Runtime;

async fn find_work() -> HashMap<i64, String> {
    // Go read from the DB or something...
    let mut work = HashMap::new();
    work.insert(1, "test".to_string());
    work.insert(2, "test".to_string());
    return work;
}

async fn do_work(id: i64, value: String) -> () {
    // Result<(), Error> {
    println!("{}: {}", id, value);
}

async fn async_main() -> () {
    let mut pending_work = HashMap::new();
    loop {
        for (id, value) in find_work().await {
            if !pending_work.contains_key(&id) {
                let fut = do_work(id, value);
                pending_work.insert(id, fut);
            }
        }

        pending_work.retain(|id, fut| {
            if isDone(fut) {
                // do something with the result
                false
            } else {
                true
            }
        });
    }
}

fn main() {
    let runtime = Runtime::new().unwrap();
    let exec = runtime.executor();

    exec.spawn(async_main());
    runtime.shutdown_on_idle();
}
...