9 个版本
0.3.0-alpha.8 | 2019 年 10 月 29 日 |
---|---|
0.3.0-alpha.7 | 2019 年 8 月 22 日 |
0.3.0-alpha.6 | 2019 年 6 月 26 日 |
0.3.0-alpha.4 | 2019 年 5 月 12 日 |
0.0.0 | 2019 年 1 月 22 日 |
#155 在 #thread-pool
232 每月下载量
在 少于 9 个 仓库中使用
85KB
826 行
运行时
⚠️ 弃用通知 ⚠️
运行时已不再积极开发。运行时背后的团队已经转向构建 async-std:Rust stdlib 的异步版本。
如果您正在寻找异步运行时,请考虑使用 async-std 或 tokio。
关于
运行时是我们想象中的异步 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 License,版本2.0(LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT许可证(LICENSE-MIT 或 http://opensource.org/licenses/MIT)
。
贡献
除非您明确说明,否则任何有意提交以包含在您的工作中的贡献,根据Apache-2.0许可证定义,都应如上双许可,不附加任何其他条款或条件。
依赖关系
~2.1–4MB
~83K SLoC