#async #tokio #generic #romio #api-bindings #thread-pool

弃用 运行时

[弃用] 让每个人都能构建异步软件

9 个版本

0.3.0-alpha.82019 年 10 月 29 日
0.3.0-alpha.72019 年 8 月 22 日
0.3.0-alpha.62019 年 6 月 26 日
0.3.0-alpha.42019 年 5 月 12 日
0.0.0 2019 年 1 月 22 日

#155#thread-pool

Download history 78/week @ 2024-04-05 85/week @ 2024-04-12 92/week @ 2024-04-19 90/week @ 2024-04-26 75/week @ 2024-05-03 84/week @ 2024-05-10 81/week @ 2024-05-17 106/week @ 2024-05-24 117/week @ 2024-05-31 79/week @ 2024-06-07 89/week @ 2024-06-14 96/week @ 2024-06-21 42/week @ 2024-06-28 48/week @ 2024-07-05 70/week @ 2024-07-12 57/week @ 2024-07-19

232 每月下载量
少于 9 仓库中使用

MIT/Apache

85KB
826

运行时

让每个人都能构建异步软件。

⚠️ 弃用通知 ⚠️

运行时已不再积极开发。运行时背后的团队已经转向构建 async-std:Rust stdlib 的异步版本。

如果您正在寻找异步运行时,请考虑使用 async-stdtokio

关于

运行时是我们想象中的异步 API 可能的样子,如果它们是 stdlib 的一部分。我们希望异步 Rust 能够反映出标准库的质量。我们相信,为了使 Rust 获得成功,不仅需要使异步 Rust 可行,而且还需要使其感觉 无缝

运行时正是这些价值的体现:一个旨在让每个人都能构建异步软件的库。

  • 运行时无关:运行时自带最少的操作系统绑定,但切换到不同的运行时只需更改一行。
  • 任何地方都可以 await:运行时允许您编写异步 main 函数、异步测试和异步基准测试。体验 Rust 中一流异步支持的感觉。
  • 为性能而构建:运行时是在后端实现之上的最薄层。所有速度,没有样板。

示例

UDP 回显服务器

use runtime::net::UdpSocket;

#[runtime::main]
async fn main() -> std::io::Result<()> {
    let mut socket = UdpSocket::bind("127.0.0.1:8080")?;
    let mut buf = vec![0u8; 1024];

    println!("Listening on {}", socket.local_addr()?);

    loop {
        let (recv, peer) = socket.recv_from(&mut buf).await?;
        let sent = socket.send_to(&buf[..recv], &peer).await?;
        println!("Sent {} out of {} bytes to {}", sent, recv, peer);
    }
}

要发送消息,请

$ nc -u localhost 8080

更多示例

属性

运行时引入了3个属性,以实现在任何地方使用 await 以及在不同运行时之间切换。每个运行时都绑定到初始化的线程。这使您能够在测试或基准测试期间测试不同的运行时。

#[runtime::main]
async fn main() {}

#[runtime::test]
async fn my_test() {}

#[runtime::bench]
async fn my_bench() {}

运行时

切换运行时只需一行代码

/// Use the default Native Runtime
#[runtime::main]
async fn main() {}

/// Use the Tokio Runtime
#[runtime::main(runtime_tokio::Tokio)]
async fn main() {}

以下是一些可用的支持运行时:

性能

运行时提供的性能与其他大多数系统语言相媲美,且用户体验极佳。

由于我们不知道您的负载是什么样的,我们无法预测哪个运行时将能最大程度地利用您的用例资源消耗。

但根据我们的基准测试,对于IO密集型应用程序,使用运行时与不使用运行时之间的差异并不明显。

 name          baseline:: ns/iter  native:: ns/iter  diff ns/iter    diff %  speedup
 notify_self   1,350,882           1,237,416             -113,466    -8.40%   x 1.09
 poll_reactor  2,270,428           2,162,264             -108,164    -4.76%   x 1.05

安装

使用cargo-edit进行操作

$ cargo add runtime --allow-prerelease

要在同一项目中使用Futures,请确保安装futures-preview以支持标准Futures。

$ cargo add futures-preview --allow-prerelease

futures-preview支持标准Futures/futures 0.3,而futures支持不再开发的futures 0.1。一旦futures集成到stdlib中,预计这两个crate将合并回futures。希望最终大部分futures都将成为stdlib的一部分。

常见问题解答(FAQ)

何时切换运行时是有用的?

现在可能最好的解决方案,未来可能不再是最好的。随着Rust的成长,生态系统也会成长。通过使运行时可插拔,您的代码可以与任何未来的变化保持向前兼容。随着事物的演变,您只需更改一行代码,就可以测试生态系统的新发展对您的代码的影响。

运行时如何进行版本控制?

我们目前处于0.3-alpha版本的发布范围,与Futures库保持一致。一旦Futures达到1.0,我们将效仿并过渡到正确的semver。

这并不意味着运行时不会发布破坏性变更。但如果我们这样做,我们将发布一个新的主要版本,并提供升级说明。我们认为运行时是一项基础技术,这意味着我们必须对我们的稳定性保证认真对待。

我可以在生产中使用运行时吗?

运行时位于您的代码和后端运行时之间的一层薄层。如果您信任生产中的后端运行时,那么您可能也可以信任运行时。

为什么运行时原生是默认的?

我们认为运行时原生提供了一个平衡的实现,适用于大多数场景。代码库小而全面,算法简单但性能良好。

特定的运行时可能会引入不同的权衡,而使用运行时,您能够比较,并为您的需求选择最佳匹配。

运行时可以用在嵌入式设备上吗?

运行时设计为与微处理器兼容,但不与微控制器兼容。开箱即用的运行时可以在Raspberry Pi等嵌入式设备上运行,并且通过适当的后端,它也应该可以在手机上运行。

微控制器在提供的功能方面非常具体,虽然将来可能存在类似运行时的库,但生态系统仍处于早期阶段,API可能也需要不同。我们不知道未来会怎样,但到目前为止,我们选择不对微控制器进行目标定位。

计时器和文件系统支持何时推出?

计时器是我们下一个目标列表中的下一个项目,与Unix域套接字一起。文件系统稍微落后一些,因为当前支持运行时的实现正在发生变化,我们还不确定如何最好地抽象它。

正确做事需要时间。但如果您想推进异步状态,我们非常希望您能参与进来!

安全性

此存储库使用 #![deny(unsafe_code)] 来确保所有内容都在100%安全的Rust中实现。

贡献

想加入我们吗?请查看指南中的“贡献”部分 The "Contributing" section of the guide 并查看一些这些问题

行为准则

运行时项目遵循 Contributor Covenant Code of Conduct。这描述了对所有贡献者期望的最小行为。

许可证

根据您的选择,许可如下

贡献

除非您明确说明,否则任何有意提交以包含在您的工作中的贡献,根据Apache-2.0许可证定义,都应如上双许可,不附加任何其他条款或条件。

依赖关系

~2.1–4MB
~83K SLoC