2022年的异步生锈

2022-02-14 11:29:06

大约一年前,Async Working Group 1开始合作编写一份共享的Async vision文档。在我们进入2022年之际,我们希望提供这一过程的最新结果,以及我们在实现这一愿景方面取得的进展。

要设置场景,请想象一下';s Rust 2024,而你';我决定在Rust建造你的第一个项目。你';我们正在做一个使用GitHub的项目,而你';I’我想要一个工具,它可以遍历存储库中的所有问题,并进行一些自动分类。您决定为此使用async Rust。你拿出锈迹斑斑的书,用拇指指向异步I/O部分。在这里,它向您展示了异步应用程序的基本结构。和任何Rust程序一样,它从main开始,但这次是异步fn。。。

翻到板条箱上。io,你搜索";github和#34;并发现有一个漂亮的板条箱螃蟹猫导航github的问题。你导入它,然后坐下来工作。您需要做的第一件事是反复讨论所有问题:

async fn main(){用于crabbycat::issues(";https://github.com/rust-lang/rust") {如果符合(发布){println!(";{发布:?}"); } }}

你的板条箱似乎工作得很好,你很高兴地发推特。很快,你发现自己和一些用户在一起,其中一个用户打开了一个PR,将其扩展到支持GitLab。为了做到这一点,它们引入了一种特性,允许您编写针对问题提供程序的通用代码。这个特性有一个方法,它返回一个迭代器(在本例中是一个异步迭代器):

trait IssueProvider{async fn issues(&;mut self,url:&;str)->impl asyncierator<;Item=Result<;Issue,Err>;}#[派生(调试)]结构问题{number:usize,header:String,assignment:String,}

现在,他们能够将主循环重构为一个在IssueProvider上通用的函数。他们决定使用dyn性状来避免多次单形性。

fn流程问题(提供者:&;mut-dyn IssueProvider){for await?提供者中的问题。问题(&34;https://github.com/rust-lang/rust") {如果符合(发布){println!(";{发布:?}"); } }}

你在公关上很开心地点击了merge,一切都很好。后来,有人想把你的系统移植到Chartreuse操作系统上运行。Chartreuse基于一个actor模型,并使用自己的自定义异步运行时——但幸运的是,您没有';我不在乎。所有代码都能够无缝地将底层运行时实现切换到Chartreuse异步运行时。

当然,这一年仍然是2022年,我们刚刚描绘的愿景不是现实——至少现在还不是。在RFCing和实现特性方面,还有很多工作要做,这些特性将让我们编写我们所讨论的代码:

采取一个&;mut dyn IssueProvider参数要求在具有异步函数的traits中支持动态调度

用于等待的代码?循环,允许在异步代码中通过迭代器轻松迭代。

标准库(流)中异步迭代的特征具有不同的名称,并且不稳定;一旦我们在traits中强烈支持异步fns,它的定义也可能会改变。

随着这项工作的进行,我们可以预期在过程中的细节会有很多变化,我们可能会决定一些细节不是';不值得;如果没有其他问题的话,生成器的语法是一个备受争议的话题。什么赢了';t change是总体愿景:除了偶尔使用async和await关键字之外,编写异步代码应该和编写同步代码一样简单。

我们';我们将异步工作组组织成了许多不同的计划,每个计划都在追求愿景的一部分。以下是当前活跃群体的列表,以及他们';自从他们开始运营以来,我已经在过去的几个月里做了很多。

我们还在traits RFC中实现了静态异步fn,并为return position impl trait起草了一份RFC(在准备好着陆之前,它还需要一些调整)。

我们';我一直在为动态调度设计,最近的一次迭代在这篇博客文章中进行了描述。

我们';我也一直在努力,比如tmandry在博客上提到的关于上下文和功能的建议。

Estebank为生成器制作了一个程序宏原型,并呼吁大家讨论语法和其他细节。

由nrc领导,探索如何使代码易于跨运行时移植,从AsyncRead和AsyncWrite之类的标准化特性开始。

由eholk领导,专注于通过较小的变化来改善现有能力,这些变化共同带来了巨大的变化。

我们';我们有一个待定的PR,它将改进生成器#39;当变量移动到屈服点之前时,进行捕获分析,以及另一个PR,它收紧了临时范围,以进一步避免不必要的生成器捕获。

古斯·韦恩(Gus Wynn)在“必须”而不是“暂停”皮棉(suspend lint)方面取得了重大进展,这种皮棉可以捕捉到值在不应该存在的等待点上存在的情况。

我们开始研究如何使异步堆栈跟踪更具可读性和帮助性。

由pnkfelix领导,致力于支持异步生态系统中的人员,他们正在构建有趣的工具来支持异步生态系统。

Michael Woerister正在探索异步崩溃转储恢复,提供了一种机制来恢复和检查基于崩溃转储的异步生锈程序的状态。

伊丽莎·魏斯曼和其他许多人最近宣布了他们0.1版的东京控制台。Tokio Console是一种用于异步程序的诊断和调试工具。它可以让您实时查看异步运行时的状态,还可以在检测到可能表明存在错误或性能问题的可疑行为时发出警告。

你可以在我们的路线图页面上找到我们计划的整套工作,该页面还链接到我们';我们正在努力。

如果你';如果你对帮助感兴趣,一个好的开始是波兰倡议页面的“如何帮助”部分。还有一个每周波兰分诊会议,你可能想参加。

我们过去被称为异步基金会工作组,或wg Async Foundation。wg async更容易输入。工作组的重点是";基金会和#34;异步的,即语言和标准库,没有';没有改变。↩