gpt4 book ai didi

rust - 混选!和Rust中的异步调用

转载 作者:行者123 更新时间:2023-12-03 11:44:13 25 4
gpt4 key购买 nike

我正在构建一个小型应用程序,该应用程序应按不同的时间间隔安排两个任务(基于rusoto AWS SDK):每X秒运行一个任务,每Y秒运行另一个任务。
我发现了提供了滴答计时器和crossbeam宏的 crate select!,将它们像这样放置在一起:

fn main() -> Result<(), Error> {
let cloudwatch_client = rusoto_cloudwatch::CloudWatchClient::new();
let rt = Runtime::new().unwrap();
let tick_a = tick(Duration::from_secs(60));
let tick_b = tick(Duration::from_secs(30));

loop {
select! {
recv(tick_a) -> _ => {
rt.block_on(cloudwatch_client.put_metric_data( /* ... */ ));
},
/* similar for tick_b */
}
}
}
这会编译,但是程序会使用 thread 'main' panicked at 'not currently running on the Tokio runtime.' panic 。通过分析回溯,这似乎来自Rusoto调用。
我在这里想念什么?有没有办法使这项工作?在Rust中,是否有更好的方法来按间隔处理任务计划?
请注意, this问题似乎无法解决我的问题。这个问题首先使用 futures::executor::block_on函数开始,并使用tokio block_on实现的 Runtime方法解决。我已经在 block_on中使用了 Runtime方法。

最佳答案

thread 'main' panicked at 'not currently running on the Tokio runtime.'


如果特定库所需的tokio运行时版本未处于 Activity 状态,则会显示此错误-因为每个主要版本使用不同的线程局部变量,并且同一构建中可以包含一个以上的库主要版本。
在您的情况下,您可能正在运行Tokio 0.3运行时,但是rusoto希望使用Tokio 0.2运行时。然后,当rusoto尝试通过Tokio 0.2(也包含在构建中)执行IO时,将检测到没有运行时处于 Activity 状态并产生错误。
要解决此问题,请确保在项目中仅使用单个tokio版本。您可能需要通过 0.2将tokio降级为 Cargo.toml,因为可能没有更新的rusoto版本。
另一个不相关的建议:
除了在计时器上使用横梁之外,您还可以在tokio运行时中运行“整体”:您可以使用tokio::select!和Tokio计时器在这里完成对横梁的操作。
参见 https://docs.rs/tokio/0.2.24/tokio/time/fn.interval.html
https://docs.rs/tokio/0.2.24/tokio/macro.select.html(示例与您的用例相似)

关于rust - 混选!和Rust中的异步调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65448585/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com