当前位置 : 主页 > 编程语言 > java >

【Rust日报】2021-04-09 tokio 计划发布基于 io-uring 的新运行时

来源:互联网 收集:自由互联 发布时间:2022-06-22
tokio-uring - tokio 基于 io-uring 版的异步运行时 tokio 今天发布了新的 RFC,提出了新的支持 io-uring 异步运行时的计划。 Tokio目前的Linux实现使用非阻塞的系统调用和epoll进行事件通知。使用

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语言中文社区


网友评论