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

Kev*_*ata 1 multithreading infinite-loop rust

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

我想要完成的是这样的:

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;
}
Run Code Online (Sandbox Code Playgroud)

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

我想到了以下解决方案:

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

但它有两个问题:

  1. 我的结构没有实现该Copy特征(使用一些第三方板条箱,因此不能在那里做太多事情)。
  2. 由于每个函数调用都将作为单独的线程运行,因此我怀疑超时在这里能否正常工作!

我应该如何处理这个问题?

cdh*_*wie 5

您可以使用一个async块来创建一个新的 future,因此如果您将每个循环包装在一个async块中,您将获得三个 future。然后你可以使用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);
Run Code Online (Sandbox Code Playgroud)

宏观join!将驱动期货。

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