当前位置:首页 > 科技  > 软件

Rust异步编程的可观察调试工具:Await-Tree

来源: 责编: 时间:2024-02-05 17:21:08 272观看
导读Async Rust中的future可以任意组合或嵌套,以实现各种控制流。假设每个Future的执行都表示为一个节点,那么可以将异步任务的异步执行组织到一个逻辑树中,该逻辑树在Future的轮询、完成和取消过程中不断转换。在本文中,我们

Async Rust中的future可以任意组合或嵌套,以实现各种控制流。假设每个Future的执行都表示为一个节点,那么可以将异步任务的异步执行组织到一个逻辑树中,该逻辑树在Future的轮询、完成和取消过程中不断转换。hah28资讯网——每日最新资讯28at.com

在本文中,我们将介绍Await-Tree,一个Async Rust的调试工具。它可以分析任务中的异步调用链和任务之间的依赖阻塞关系,以最小的运行时开销显著提高系统的可观察性和可调试性。await-tree允许开发人员在运行时转储这个执行树,每个Future的跨度由instrument_await注释。hah28资讯网——每日最新资讯28at.com

下面我们看一个基本示例:hah28资讯网——每日最新资讯28at.com

在Cargo.toml文件中,加入以下依赖项:hah28资讯网——每日最新资讯28at.com

[dependencies]await-tree = "0.1.2"futures = "0.3.30"tokio = {version = "1.35.1", features = ["full"]}

hah28资讯网——每日最新资讯28at.com

代码如下:hah28资讯网——每日最新资讯28at.com

use std::time::Duration;use await_tree::{Config, InstrumentAwait, Registry};use futures::future::{join, pending};use tokio::time::sleep;async fn bar(i: i32) {    // `&'static str` span    baz(i).instrument_await("baz in bar").await}async fn baz(i: i32) {    // runtime `String` span is also supported    pending()        .instrument_await(format!("pending in baz {i}"))        .await}async fn foo() {    // spans of joined futures will be siblings in the tree    join(        bar(3).instrument_await("bar"),        baz(2).instrument_await("baz"),    )    .await;}#[tokio::main]async fn main() {    let mut registry = Registry::new(Config::default());    let root = registry.register((), "foo");    tokio::spawn(root.instrument(foo()));    sleep(Duration::from_secs(1)).await;    let tree = registry.get(&()).unwrap().to_string();    println!("{tree}");}

hah28资讯网——每日最新资讯28at.com

执行cargo run,结果如下:hah28资讯网——每日最新资讯28at.com

foo [1.002s]  baz [1.002s]    pending in baz 2 [1.002s]  bar [1.002s]    baz in bar [1.002s]      pending in baz 3 [1.002s]

hah28资讯网——每日最新资讯28at.com

在代码中,我们有一些简单的async函数嵌套调用和使用join并发执行。与通常的代码不同,我们在希望跟踪的每个关键future后面添加.instrument_await,并为其指定名称。此名称可以是静态字符串常量,也可以包含其他运行时信息。hah28资讯网——每日最新资讯28at.com

我们再看另外一个例子:hah28资讯网——每日最新资讯28at.com

use std::time::Duration;use await_tree::{Config, InstrumentAwait, Registry};use futures::channel::oneshot::{self, Receiver};use futures::future::{pending, select};use futures::FutureExt;use tokio::time::sleep;async fn work(rx: Receiver<()>) {    let mut fut = pending().instrument_await("fut");    let _ = select(        sleep(Duration::from_millis(500))            .instrument_await("sleep")            .boxed(),        &mut fut,    )    .instrument_await("select")    .await;    // 等待信号继续    rx.instrument_await("rx").await.unwrap();    fut.await}#[tokio::main]async fn main() {    let mut registry = Registry::new(Config::default());    let root = registry.register((), "work");    let (tx, rx) = oneshot::channel();    tokio::spawn(root.instrument(work(rx)));    sleep(Duration::from_millis(100)).await;    let tree = registry.get(&()).unwrap().to_string();    println!("{tree}");    sleep(Duration::from_secs(1)).await;    let tree = registry.get(&()).unwrap().to_string();    println!("{tree}");    tx.send(()).unwrap();    sleep(Duration::from_secs(1)).await;    let tree = registry.get(&()).unwrap().to_string();    println!("{tree}");}

hah28资讯网——每日最新资讯28at.com

结果如下:hah28资讯网——每日最新资讯28at.com

work [101.181ms]  select [101.066ms]    fut [101.044ms]    sleep [101.044ms]work [1.103s]  rx [601.779ms][Detached 4]  fut [1.103s]work [2.105s]  fut [2.105s]

hah28资讯网——每日最新资讯28at.com

这个例子展示了如何从树中分离并重新挂载一个span。hah28资讯网——每日最新资讯28at.com

hah28资讯网——每日最新资讯28at.com

hah28资讯网——每日最新资讯28at.com

总结

在本文中,我们介绍了await- tree作为Async Rust中可观察性的强大工具。await- tree是为Async Rust原生设计的回溯工具,它允许开发者实时观察每个异步任务的执行状态,并分析不同future或任务之间的依赖阻塞关系。hah28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-74193-0.htmlRust异步编程的可观察调试工具:Await-Tree

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: .NET中使用BootstrapBlazor组件库Table实操篇

下一篇: 创建线程的几种方式?你知道吗?

标签:
  • 热门焦点
  • 5月iOS设备好评榜:iPhone 14仅排第43?

    来到新的一月,安兔兔的各个榜单又重新汇总了数据,像安卓阵营的榜单都有着比较大的变动,不过iOS由于设备的更新换代并没有那么快,所以相对来说变化并不大,特别是iOS好评榜,老款设
  • 线程通讯的三种方法!通俗易懂

    线程通信是指多个线程之间通过某种机制进行协调和交互,例如,线程等待和通知机制就是线程通讯的主要手段之一。 在 Java 中,线程等待和通知的实现手段有以下几种方式:Object 类下
  • 零售大模型“干中学”,攀爬数字化珠峰

    文/侯煜编辑/cc来源/华尔街科技眼对于绝大多数登山爱好者而言,攀爬珠穆朗玛峰可谓终极目标。攀登珠峰的商业路线有两条,一是尼泊尔境内的南坡路线,一是中国境内的北坡路线。相
  • 中国家电海外掘金正当时|出海专题

    作者|吴南南编辑|胡展嘉运营|陈佳慧出品|零态LT(ID:LingTai_LT)2023年,出海市场战况空前,中国创业者在海外纷纷摩拳擦掌,以期能够把中国的商业模式、创业理念、战略打法输出海外,他们依
  • 当家的盒马,加速谋生

    来源 | 价值星球Planet作者 | 归去来自己&ldquo;当家&rdquo;的盒马,开始加速谋生了。据盒马官微消息,盒马计划今年开放生鲜供应链,将其生鲜商品送往食堂。目前,盒马在上海已经与
  • 超闭合精工铰链 彻底消灭缝隙 三星Galaxy Z Flip5与Galaxy Z Fold5发布

    2023年7月26日,三星电子正式发布了Galaxy Z Flip5与Galaxy Z Fold5。三星新一代折叠屏手机采用超闭合精工铰链,让折叠后的缝隙不再可见。同时,配合处
  • 三星Galaxy Z Fold/Flip 5国行售价曝光 :最低7499元/12999元起

    据官方此前宣布,三星将于7月26日也就是明天在韩国首尔举办Unpacked活动,届时将带来带来包括Galaxy Buds 3、Galaxy Watch 6、Galaxy Tab S9、Galaxy
  • 滴滴违法违规被罚80.26亿 共存在16项违法事实

    滴滴违法违规被罚80.26亿 存在16项违法事实开始于2121年7月,历经一年时间,网络安全审查办公室对“滴滴出行”网络安全审查终于有了一个暂时的结束。据“网信
  • 中关村论坛11月25日开幕,15位诺奖级大咖将发表演讲

    11月18日,记者从2022中关村论坛新闻发布会上获悉,中关村论坛将于11月25至30日在京举行。本届中关村论坛由科学技术部、国家发展改革委、工业和信息化部、国务
Top