运行 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;
});
}
但它有两个问题:
- 我的结构没有实现
Copy
特性(使用一些第 3 方板条箱,所以不能在那里做太多)。
- 因为这里每个函数调用都会 运行 作为一个单独的线程,我怀疑这里的超时是否能正常工作!
我该如何处理?
您可以使用 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
。
我有 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;
});
}
但它有两个问题:
- 我的结构没有实现
Copy
特性(使用一些第 3 方板条箱,所以不能在那里做太多)。 - 因为这里每个函数调用都会 运行 作为一个单独的线程,我怀疑这里的超时是否能正常工作!
我该如何处理?
您可以使用 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
。