#future #reactor #async #proactor

迫切未来

基于完成处理器的futures,用于单线程异步编程(反应器模式)

1个不稳定版本

0.0.1 2021年3月12日

#34#反应器

22 每月下载量

BSD-2-Clause

13KB
191

迫切未来

简介

此crate实现基于完成处理器的futures。它旨在用于具有反应器/反应器模式的单线程异步编程,类似于Node.js的异步模型。

动机

在Rust的本地future中,当子future完成时,根任务会被唤醒,它会递归地轮询子futures直到达到真正的重入点。在此crate提供的future中,当子future完成时,下一个要运行的future会直接被唤醒,而不是需要由父future轮询。本质上,每个future都是自己的根任务。这类似于JavaScript的Promises,它们在创建时立即开始执行。因此,此crate提供的future类型命名为Eager

考虑以下使用Rust本地future的代码。它只是使用thenn个futures串联起来,其中每个future执行一些I/O操作,在这里由yield_now模拟。人们可能会期望其运行时间与n成线性关系,但实际上它是n的平方,因为每次I/O操作完成时,我们都必须从开始轮询next链。此crate提供的future不会表现出这种行为。

fn chain_many(n: isize) -> BoxFuture<'static, isize> {
    let mut future = async { 0 }.boxed();
    for _ in 0..n {
        future = future.then(|x| async move {
            tokio::task::yield_now().await;
            x + 1
        }).boxed()
    }
    future
}

注意

与Rust的本地futures相比,这种方法引入了动态分配开销。此crate仅适用于您的控制流是动态组合的,如上面的示例。对于大多数是静态的控制流,Rust的本地future可能会因为像激进内联这样的优化而表现得更好。此crate不与async / await一起使用。

许可证:BSD-2-Clause

无运行时依赖