为什么像Tokio这样的异步运行时是必要的?

8
我的第一个计算机系统项目经验是使用纯Java构建服务器,然后在Android手机上构建客户端。从那时起,我发现有很多框架可以帮助管理可扩展性并消除编写样板代码的需要。
我正在尝试了解TokioRayon等服务的功能。
我在Tokio教程页面上看到了这段话,但我很难理解它:
“当您以异步方式编写应用程序时,通过减少同时执行许多任务的成本,使其能够更好地扩展。但是,异步Rust代码不会自行运行,因此您必须选择运行时来执行它。”
我最初认为“运行时”可能指的是二进制文件可以运行的位置,但看起来Tokio只提供了Rust标准库中已经可用的函数,而Rayon则实现了标准库中不存在的函数。

标准库中的异步函数实现是否写得不好,还是我没有理解Tokio提供的服务?


3
Rust标准库力求足够轻便,不成为“运行时”的一部分。这点与Go不同,后者有自己的ABI;如果没有Go运行时环境,就无法运行Go代码,但你可以在没有繁重的粘合剂来管理运行时环境中的进出数据的情况下从C或任何其他语言中调用Rust。 - Charles Duffy
1
在没有运行时的情况下,您可以提供什么类型的异步功能是有限制的,因为您需要“某些东西”来跟踪等待某些依赖项的代码,以便在可调度执行之前进行排队,除非您将异步调用限制为仅在生成代码的特定块中可用(其中可能的跳转仅在这些块中的事物之间)-这是Clojure的core.async采取的方法。 - Charles Duffy
2
标准库中是否存在编写不良的异步函数的标准实现?我认为标准库中根本没有任何异步函数。你找到了哪些被标记为“async”的函数? - Shepmaster
3
Rust没有Promises,它有Future。 async函数生成实现Future trait 的类型。请注意,您链接到该库的旧版本文档(而且也不是标准库)。请参阅当前版本文档。 - Shepmaster
1
@ArnoldZahrneinder,运行时编译进每个可执行文件中;它负责像 goroutine 调度这样的任务。Go 的维护者将其描述为一个运行时;请阅读 https://pkg.go.dev/runtime。 - Charles Duffy
显示剩余6条评论
1个回答

10

目前,Rust标准库中没有提供异步运行时。有关详细信息,请参见《Rust异步编程》,特别是“异步生态系统”一章。

Rust目前仅提供撰写异步代码所需的基本要素。重要的是,在标准库中还未提供执行器、任务、反应器、组合器以及低级I/O Future和Trait。与此同时,由社区提供的异步生态系统填补了这些空缺。

Rust对向后兼容性有非常严格的要求,并且他们没有选择锁定特定的运行时。选择一个运行时可能有优先考虑一个功能而不是另外一个(例如功能与大小),将其作为标准库的一部分会强加某些并不清楚是否适用于所有项目的选择。随着社区项目更好地探索这个领域并帮助确定最佳选择的混合方式,这种情况可能会在未来发生改变,而不受强大的向后兼容性承诺的影响。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接