Rust异步浅谈

本文探讨了Rust异步编程的原理,包括Future、Runtime、Executor、Reactor等核心概念,阐述了异步执行流程及其实现,强调了在异步生态中的Stream、Sink和Timer的重要性,并介绍了简化异步编程的Async/Await语法。适合有一定操作系统、IO多路复用和数据结构基础的读者学习。
摘要由CSDN通过智能技术生成

前提

  这篇文章主要描述了Rust中异步的原理,Rust异步也是在最近的版本中(1.39)中才稳定下来。希望可以通过这边文章在提高自己认知的情况下,也可以给读者带来一些解惑。(来自于本人被Rust异步毒打的一些经验之谈).

  阅读这篇文章需要对操作系统,IO多路复用,以及一些数据结构有一定的概念。

Future

  Future 字面的意思就是未来发生的事情,在程序中则代表了一系列暂时没有结果的运算子,Future需要程序主动去poll(轮询)才能获取到最终的结果,每一次轮询的结果可能是Ready或者Pending

  当Ready的时候,证明当前Future已完成,代码逻辑可以向下执行;当Pending的时候,代表当前Future并未执行完成,代码不能向下执行,看到这里就要问了,那什么时候才能向下执行呢,这里的关键在于Runtime中的Executor需要不停的去执行Futurepoll操作,直至Future返回Ready可以向下执行为止。等等,熟悉Linux的同学可能要说了,怎么感觉和Epoll模型是非常的相似呢,没错,这确实非常相像(但是依然有些许不同,Future可以避免空的轮询),看样子优秀的设计在哪里都可以看到类似的身影。为了实现Rust声称的高性能与零开销抽象,这里做了一些优化,下面一一讲述。

Future结构

pub enum Poll<T> {
    Ready(T),
    Pending,
}

pub trait Future {
    type Output;

    fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output>;
}

Future的定义非常简单,Output代表了Future返回的值的类型,而poll方法是执行Future的关键,poll方法可以返回一个Poll类型,Poll类型是一个Enum,包装了ReadyPending两种状态。

Runtime

Runtime 由两部分组成,ExecutorReactor

Executor为执行器,没有任何阻塞的等待,循环执行一系列就绪的Future,当Future返回pending的时候,会将Future转移到Reactor上等待进一步的唤醒。

Reactor为反应器(唤醒器),轮询并唤醒挂在的事件,并执行对应的wake方法,通常来说,wake会将Future的状态变更为就绪,同时将Future放到Executor的队列中等待执行。

执行流程

下面的序列图大概简单的描绘了FutureExecutorReactor之间来回转移的流程与状态变化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值