自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Rust異步編程的可觀察調(diào)試工具:Await-Tree

開發(fā) 開發(fā)工具
在本文中,我們介紹了await- tree作為Async Rust中可觀察性的強大工具。await- tree是為Async Rust原生設(shè)計的回溯工具,它允許開發(fā)者實時觀察每個異步任務(wù)的執(zhí)行狀態(tài),并分析不同future或任務(wù)之間的依賴阻塞關(guān)系。?

Async Rust中的future可以任意組合或嵌套,以實現(xiàn)各種控制流。假設(shè)每個Future的執(zhí)行都表示為一個節(jié)點,那么可以將異步任務(wù)的異步執(zhí)行組織到一個邏輯樹中,該邏輯樹在Future的輪詢、完成和取消過程中不斷轉(zhuǎn)換。

在本文中,我們將介紹Await-Tree,一個Async Rust的調(diào)試工具。它可以分析任務(wù)中的異步調(diào)用鏈和任務(wù)之間的依賴阻塞關(guān)系,以最小的運行時開銷顯著提高系統(tǒng)的可觀察性和可調(diào)試性。await-tree允許開發(fā)人員在運行時轉(zhuǎn)儲這個執(zhí)行樹,每個Future的跨度由instrument_await注釋。

下面我們看一個基本示例:

在Cargo.toml文件中,加入以下依賴項:

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

代碼如下:

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}");
}

執(zhí)行cargo run,結(jié)果如下:

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]

在代碼中,我們有一些簡單的async函數(shù)嵌套調(diào)用和使用join并發(fā)執(zhí)行。與通常的代碼不同,我們在希望跟蹤的每個關(guān)鍵future后面添加.instrument_await,并為其指定名稱。此名稱可以是靜態(tài)字符串常量,也可以包含其他運行時信息。

我們再看另外一個例子:

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;

    // 等待信號繼續(xù)
    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}");
}

結(jié)果如下:

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]

這個例子展示了如何從樹中分離并重新掛載一個span。

總結(jié)

在本文中,我們介紹了await- tree作為Async Rust中可觀察性的強大工具。await- tree是為Async Rust原生設(shè)計的回溯工具,它允許開發(fā)者實時觀察每個異步任務(wù)的執(zhí)行狀態(tài),并分析不同future或任務(wù)之間的依賴阻塞關(guān)系。

責(zé)任編輯:武曉燕 來源: coding到燈火闌珊
相關(guān)推薦

2022-08-28 10:36:53

調(diào)試工具通用

2021-09-26 09:50:21

開發(fā)技能程序

2024-01-24 13:22:40

Python調(diào)試工具技巧

2024-07-09 08:31:26

2014-07-15 10:08:42

異步編程In .NET

2023-03-23 13:48:00

工具應(yīng)用場景選型

2016-12-02 20:23:51

AndroidADB

2012-02-24 09:25:20

JavaScript

2021-06-28 08:10:59

JavaScript異步編程

2011-08-15 17:38:48

iPhone開發(fā)調(diào)試工具

2023-03-29 08:18:16

Go調(diào)試工具

2023-02-21 08:00:00

2023-11-17 08:00:54

Tetragon執(zhí)行工具

2024-02-23 10:00:27

Linux工具

2022-08-21 14:05:54

調(diào)試工具CDP

2020-05-21 15:53:59

遠程調(diào)試工具

2018-11-27 11:35:32

systemtapMySQL調(diào)試工具

2024-06-25 08:33:48

2025-03-31 03:25:00

2023-06-12 16:45:20

數(shù)據(jù)管理
點贊
收藏

51CTO技術(shù)棧公眾號