运行 3 无限循环独立异步任务

Run 3 async task indepedently in infinite loop

我有 3 种不同的异步方法,例如 func1, func2, func3 在结构对象上。

我想要完成的是:

loop {
    obj.func1().await;
    set_timeout(Duration::from_secs(5)).await;
}

loop {
    obj.func2().await;
    set_timeout(Duration::from_secs(5)).await;
}

loop {
    obj.func3().await;
    set_timeout(Duration::from_secs(5)).await;
}

我希望所有这 3 个循环并行 运行。显然,在这种形式下它不会工作,因为第二个和第三个循环将无法访问。

我想到了以下解决方案:

loop {
    thread::spawn(move || async move {
        obj.func1().await;
        obj.func2().await;
        obj.func3().await;
        set_timeout(Duration::from_secs(5)).await;
    });
}

但它有两个问题:

  1. 我的结构没有实现 Copy 特性(使用一些第 3 方板条箱,所以不能在那里做太多)。
  2. 因为这里每个函数调用都会 运行 作为一个单独的线程,我怀疑这里的超时是否能正常工作!

我该如何处理?

您可以使用 async 块来创建新的未来,因此如果您将每个循环包装在 async 块中,您将获得三个未来。然后你可以使用 join! 宏同时等待它们:

let fut1 = async {
    loop {
        obj.func1().await;
        set_timeout(Duration::from_secs(5)).await;
    }
};

let fut2 = async {
    loop {
        obj.func2().await;
        set_timeout(Duration::from_secs(5)).await;
    }
};

let fut3 = async {
    loop {
        obj.func3().await;
        set_timeout(Duration::from_secs(5)).await;
    }
};

join!(fut1, fut2, fut3);

join! 宏将推动期货。

或者,您的异步运行时可能有一种方法可以将未来作为新的独立任务提交,例如 tokio::spawn