tokio-uring - tokio 基于 io-uring 版的异步运行时
tokio 今天发布了新的 RFC,提出了新的支持 io-uring 异步运行时的计划。
Tokio目前的Linux实现使用非阻塞的系统调用和epoll进行事件通知。使用epoll,调整后的TCP代理将在用户态之外花费70%至80%的CPU周期,包括执行syscall和在内核和用户态之间复制数据的周期。2019年,Linux增加了一个新的API,即io-uring,它通过消除大多数syscall和提前映射用于字节缓冲区的内存区域来减少开销。比较io-uring与epoll的benchmark会发现提升还是很显著的;一个TCP echo客户端和服务器显示出高达60%的改进。虽然还没有测试过,但使用io-uring代替Tokio的线程池策略将会显著的改善 IO 操作。
由于io-uring与epoll有很大的不同,Tokio必须提供一套新的API来充分利用减少的开销。然而,Tokio的稳定性保证意味着Tokio API最早要到2024年才能改变。此外,io-uring API还在不断发展,计划在不久的将来推出新功能。与其等待io-uring的成熟和Tokio 2.0的发布,tokio 将发布一个独立的 crate,专门用于暴露io-uring的API。这个新的 crate 将能够在不违反 Tokio 稳定性保证的情况下,快速迭代突破性的变化。只部署在 Linux kernels 5.10 或更高版本上的应用程序,当充分利用 io-uring 的优势提供可衡量的好处时,可以选择使用这个 crate。预期的用例包括 TCP 代理、HTTP 文件服务器和数据库。
链接:https://github.com/tokio-rs/tokio-uring/pull/1
Rust 标准库的 trait 引导大全
Rust 标准库提供了大量的 Trait,每个 Trait 的功能是什么?怎样区分功能有点类似的 Trait 的使用场景?这篇博客非常详细的介绍了标准库中各种内置 Trait,非常值得阅读。
链接:https://github.com/pretzelhammer/rust-blog/blob/master/posts/tour-of-rusts-standard-library-traits.md
Starlark -- Facebook 用 Rust 重新实现了 Starlark 这门编程语言
Starlark 是 Google 开发的类似于 Python3 的一门编程语言,主要用在 Google 自己的构建工具 Bazel 和 Facebook 的构建工具 Buck 中。Starlark 目前有三种实现,一种是 Go,一种是 Java,另外一种就是现在这个项目,使用 Rust 实现。Rust 的初版是 Google 实现的,现在给了 Facebook。Rust 实现包括了完整的 parser,evaluator,linter 和 debugger。对编程语言感兴趣的朋友可以看看。
链接:https://developers.facebook.com/blog/post/2021/04/08/rust-starlark-library/
Github: https://github.com/facebookexperimental/starlark-rust
robusta - 一个方便生成 JNI 交互代码的库
有了他就可以避免写那些繁琐冗长的 Java JNI 函数名了!
例子:
use robusta_jni::bridge;
use robusta_jni::convert::Signature;
#[bridge]
mod jni {
#[derive(Signature)]
#[package(com.example.robusta)]
struct HelloWorld;
impl HelloWorld {
pub extern "jni" fn special(mut input1: Vec<i32>, input2: i32) -> Vec<String> {
input1.push(input2);
input1.iter().map(ToString::to_string).collect()
}
}
}
package com.example.robusta;
import java.util.*;
class HelloWorld {
private static native ArrayList<String> special(ArrayList<Integer> input1, int input2);
static {
System.loadLibrary("robusta_example");
}
public static void main(String[] args) {
ArrayList<String> output = HelloWorld.special(new ArrayList<Integer>(List.of(1, 2, 3)), 4);
System.out.println(output)
}
}
链接:https://github.com/giovanniberti/robusta
社区学习交流平台订阅:
- Rustcc论坛: 支持rss
- 微信公众号:Rust语言中文社区