利用扩展trait方法实现探视Futures每次poll进度

 看一篇英文文章介绍了一种利用扩展Trait技巧来debug Futrue每次poll时的情况。

原文:Inspecting Futures

(原文使用了futrues库演示,可能std库当时异步未稳定)

你有没有想过你的futures在什么时候被poll,然后返回什么?这是一个future的包装类型在任何情况下都会打印出来poll的情况。

(显然,内部类型必须是Debug)。

use std::fmt::Debug;
use std::future::Future;
use std::pin::Pin;
use std::task::{Context, Poll};

#[derive(Debug)]
pub struct InspectFuture<T, F: Future<Output=T>>
    where T: Debug {
    future: F,
    label: String,
}

impl<T, F> Future for InspectFuture<T, F>
    where T: Debug,
          F: Future<Output=T>+ std::marker::Unpin  {
    type Output = T;
    fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
        let poll =  Future::poll(Pin::new(&mut self),cx);//修改处
        println!("Future {} polled: {:?}", self.label, poll);
        poll
    }
}

pub trait InspectExt<T>
    where T: Debug,
          Self: Future<Output=T> + Sized {
    fn inspect(self, label: &str) -> InspectFuture<T, Self>;
}

impl<T, F> InspectExt<T> for F
    where T: Debug,
          F: Future<Output=T> {
    fn inspect(self, label: &str) -> InspectFuture<T, Self> {
        InspectFuture { label: label.to_owned(), future: self }
    }
}

fn main() {
    let result = async { 5 };
    let result = result.inspect("test");//转换InspectFuture包装类,
    // block_on 拉取result时,每次都会打印出进度,达到debug的目标
}

 上面的思路技巧也可以用到其它地方。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值