 Rust 异步并发框架在移动端的应用 - 陈明煜chenmingyu4@huawei.com 华为 公共开发部 嵌入式软件能力中心 本科就读加州大学圣地亚哥分校,毕业时长两年半, Rustacean 在 华为 目前正在使用 Rust 开发并行调度框架等模块。 Rust 异步并发框架在移动端的应用 陈明煜 chenmingyu4@huawei.com 华为 公共开发部 嵌入式软件能力中心 Applications of Rust Runtime mobile environment Rust 异步机制 Asynchronous Rust 异步并发框架是许多大型应用、系统具备的底层能力。 区别于多线程编程模型,它带来以下优势:  任务调度颗粒度更小,充分利用线程资源  更可控的线程数  单个任务资源占用:几十 KB -> 几百 Byte  任务切换时间 : 10 微秒 -> 100 纳秒 Rust 语言并没有提供异步并发框架, Third Party Runtime 目前 Rust 社区最广泛使用的事件 驱动型调度框架,擅长处理大量异 步 IO 的场景。具有非常强大的生 态。 tokio 第一个适配 Rust async/await 原语 的运行时库,与 tokio 类似支持异步 IO ,目前已经半废弃 async-std 更轻量化的调度框架,功能被拆分 到其他多个库中, IO 密集场景性 能不如 Tokio smol0 码力 | 25 页 | 1.64 MB | 1 年前3 Rust 异步并发框架在移动端的应用 - 陈明煜chenmingyu4@huawei.com 华为 公共开发部 嵌入式软件能力中心 本科就读加州大学圣地亚哥分校,毕业时长两年半, Rustacean 在 华为 目前正在使用 Rust 开发并行调度框架等模块。 Rust 异步并发框架在移动端的应用 陈明煜 chenmingyu4@huawei.com 华为 公共开发部 嵌入式软件能力中心 Applications of Rust Runtime mobile environment Rust 异步机制 Asynchronous Rust 异步并发框架是许多大型应用、系统具备的底层能力。 区别于多线程编程模型,它带来以下优势:  任务调度颗粒度更小,充分利用线程资源  更可控的线程数  单个任务资源占用:几十 KB -> 几百 Byte  任务切换时间 : 10 微秒 -> 100 纳秒 Rust 语言并没有提供异步并发框架, Third Party Runtime 目前 Rust 社区最广泛使用的事件 驱动型调度框架,擅长处理大量异 步 IO 的场景。具有非常强大的生 态。 tokio 第一个适配 Rust async/await 原语 的运行时库,与 tokio 类似支持异步 IO ,目前已经半废弃 async-std 更轻量化的调度框架,功能被拆分 到其他多个库中, IO 密集场景性 能不如 Tokio smol0 码力 | 25 页 | 1.64 MB | 1 年前3
 Hello 算法 1.2.0 简体中文 Rust 版. . . . . . . . . . . . . . . . . 307 第 14 章 动态规划 308 14.1 初探动态规划 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309 14.2 动态规划问题特性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315 14.3 动态规划解题思路 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320 14.4 0‑1 背包问题 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ‧ 数据结构:基本数据类型和数据结构的分类方法。数组、链表、栈、队列、哈希表、树、堆、图等数据 结构的定义、优缺点、常用操作、常见类型、典型应用、实现方法等。 ‧ 算法:搜索、排序、分治、回溯、动态规划、贪心等算法的定义、优缺点、效率、应用场景、解题步骤 和示例问题等。 第 0 章 前言 www.hello‑algo.com 3 图 0‑1 本书主要内容 0.1.3 致谢 本书在开源0 码力 | 387 页 | 18.51 MB | 10 月前3 Hello 算法 1.2.0 简体中文 Rust 版. . . . . . . . . . . . . . . . . 307 第 14 章 动态规划 308 14.1 初探动态规划 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309 14.2 动态规划问题特性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315 14.3 动态规划解题思路 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320 14.4 0‑1 背包问题 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ‧ 数据结构:基本数据类型和数据结构的分类方法。数组、链表、栈、队列、哈希表、树、堆、图等数据 结构的定义、优缺点、常用操作、常见类型、典型应用、实现方法等。 ‧ 算法:搜索、排序、分治、回溯、动态规划、贪心等算法的定义、优缺点、效率、应用场景、解题步骤 和示例问题等。 第 0 章 前言 www.hello‑algo.com 3 图 0‑1 本书主要内容 0.1.3 致谢 本书在开源0 码力 | 387 页 | 18.51 MB | 10 月前3
 Hello 算法 1.1.0 Rust版. . . . . . . . . . . . . . . . . 307 第 14 章 动态规划 309 14.1 初探动态规划 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310 14.2 动态规划问题特性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316 14.3 动态规划解题思路 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321 14.4 0‑1 背包问题 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ‧ 数据结构:基本数据类型和数据结构的分类方法。数组、链表、栈、队列、哈希表、树、堆、图等数据 结构的定义、优缺点、常用操作、常见类型、典型应用、实现方法等。 ‧ 算法:搜索、排序、分治、回溯、动态规划、贪心等算法的定义、优缺点、效率、应用场景、解题步骤 和示例问题等。 第 0 章 前言 hello‑algo.com 3 图 0‑1 本书主要内容 0.1.3 致谢 本书在开源社区众多0 码力 | 388 页 | 18.50 MB | 1 年前3 Hello 算法 1.1.0 Rust版. . . . . . . . . . . . . . . . . 307 第 14 章 动态规划 309 14.1 初探动态规划 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310 14.2 动态规划问题特性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316 14.3 动态规划解题思路 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321 14.4 0‑1 背包问题 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ‧ 数据结构:基本数据类型和数据结构的分类方法。数组、链表、栈、队列、哈希表、树、堆、图等数据 结构的定义、优缺点、常用操作、常见类型、典型应用、实现方法等。 ‧ 算法:搜索、排序、分治、回溯、动态规划、贪心等算法的定义、优缺点、效率、应用场景、解题步骤 和示例问题等。 第 0 章 前言 hello‑algo.com 3 图 0‑1 本书主要内容 0.1.3 致谢 本书在开源社区众多0 码力 | 388 页 | 18.50 MB | 1 年前3
 Hello 算法 1.0.0 Rust版. . . . . . . . . . . . . . . . . 306 第 14 章 动态规划 307 14.1 初探动态规划 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 308 14.2 动态规划问题特性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314 14.3 动态规划解题思路 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319 14.4 0‑1 背包问题 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ‧ 数据结构:基本数据类型和数据结构的分类方法。数组、链表、栈、队列、哈希表、树、堆、图等数据 结构的定义、优缺点、常用操作、常见类型、典型应用、实现方法等。 ‧ 算法:搜索、排序、分治、回溯、动态规划、贪心等算法的定义、优缺点、效率、应用场景、解题步骤 和示例问题等。 第 0 章 前言 hello‑algo.com 3 图 0‑1 本书主要内容 0.1.3 致谢 本书在开源社区众多0 码力 | 383 页 | 17.61 MB | 1 年前3 Hello 算法 1.0.0 Rust版. . . . . . . . . . . . . . . . . 306 第 14 章 动态规划 307 14.1 初探动态规划 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 308 14.2 动态规划问题特性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314 14.3 动态规划解题思路 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319 14.4 0‑1 背包问题 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ‧ 数据结构:基本数据类型和数据结构的分类方法。数组、链表、栈、队列、哈希表、树、堆、图等数据 结构的定义、优缺点、常用操作、常见类型、典型应用、实现方法等。 ‧ 算法:搜索、排序、分治、回溯、动态规划、贪心等算法的定义、优缺点、效率、应用场景、解题步骤 和示例问题等。 第 0 章 前言 hello‑algo.com 3 图 0‑1 本书主要内容 0.1.3 致谢 本书在开源社区众多0 码力 | 383 页 | 17.61 MB | 1 年前3
 Await-Tree Async Rust 可观测性的灵丹妙药 -  赵梓淇异步编程的共同优势 • async/await 关键字 • 用户态调度 • Async Rust 的独特优势 • Ownership 与 Lifetime • 无栈协程 Async Rust 回顾 Rust 的无栈协程抽象 — Future Async Rust 回顾 • 通过 poll 驱动的状态机 • 组合嵌套为调度单元: Task • async fn 语法糖 Async Rust 的执行逻辑 (Join / Select / Timeout) • 动态的调用关系 • 痛点:观测与调试工具无法理解灵活的执行逻辑 • Backtrace 不够直观 ( 调用栈 -> 调用树 ) • Tracing 无法追踪调用关系的变化 Async Rust 观测与调试的痛点 Async Rust 回顾 • 特性:用户态调度的无栈协程 • Pending Task 不存在栈空间 • 痛点:观测与调试工具无法还原0 码力 | 37 页 | 8.60 MB | 1 年前3 Await-Tree Async Rust 可观测性的灵丹妙药 -  赵梓淇异步编程的共同优势 • async/await 关键字 • 用户态调度 • Async Rust 的独特优势 • Ownership 与 Lifetime • 无栈协程 Async Rust 回顾 Rust 的无栈协程抽象 — Future Async Rust 回顾 • 通过 poll 驱动的状态机 • 组合嵌套为调度单元: Task • async fn 语法糖 Async Rust 的执行逻辑 (Join / Select / Timeout) • 动态的调用关系 • 痛点:观测与调试工具无法理解灵活的执行逻辑 • Backtrace 不够直观 ( 调用栈 -> 调用树 ) • Tracing 无法追踪调用关系的变化 Async Rust 观测与调试的痛点 Async Rust 回顾 • 特性:用户态调度的无栈协程 • Pending Task 不存在栈空间 • 痛点:观测与调试工具无法还原0 码力 | 37 页 | 8.60 MB | 1 年前3
 Comprehensive Rust(简体中文) 202412165 29.3 尝试转换 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166 29.4 动态错误类型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167 29.5 thiserror 和 anyhow 裸机:为期一天的课程,介绍如何使用 Rust 进行裸机(嵌入式)开发。课程内容涵盖微控制器和应用 处理器。 • 并发:为期一天的课程,介绍 Rust 中的并发性。我们将涵盖传统并发(使用线程和互斥锁进行抢占 式调度)和 async/await 并发(使用 futures 进行协作式多任务处理)。 非目标 Rust 是一门庞大的语言,短短几天的课程无法覆盖其全部内容。本课程不包括以下内容: • 学习如何开发宏:请参阅 本课程假设你已经具备编程知识。Rust 是一种静态类型语言,本课程有时会将其与 C 和 C++ 进行比较, 以便更好地解释或对比 Rust 的设计。 如果你会使用 Python 或 JavaScript 等动态类型语言编程,那么你也能够很好地跟上进度。 10 这是演讲者备注(Speaker Notes)的示例。页面中使用它来为幻灯片添加备注信息,其内容包括讲师应涉 及的要点,以及对课堂上可能出现的典型问题的回答。0 码力 | 359 页 | 1.33 MB | 10 月前3 Comprehensive Rust(简体中文) 202412165 29.3 尝试转换 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166 29.4 动态错误类型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167 29.5 thiserror 和 anyhow 裸机:为期一天的课程,介绍如何使用 Rust 进行裸机(嵌入式)开发。课程内容涵盖微控制器和应用 处理器。 • 并发:为期一天的课程,介绍 Rust 中的并发性。我们将涵盖传统并发(使用线程和互斥锁进行抢占 式调度)和 async/await 并发(使用 futures 进行协作式多任务处理)。 非目标 Rust 是一门庞大的语言,短短几天的课程无法覆盖其全部内容。本课程不包括以下内容: • 学习如何开发宏:请参阅 本课程假设你已经具备编程知识。Rust 是一种静态类型语言,本课程有时会将其与 C 和 C++ 进行比较, 以便更好地解释或对比 Rust 的设计。 如果你会使用 Python 或 JavaScript 等动态类型语言编程,那么你也能够很好地跟上进度。 10 这是演讲者备注(Speaker Notes)的示例。页面中使用它来为幻灯片添加备注信息,其内容包括讲师应涉 及的要点,以及对课堂上可能出现的典型问题的回答。0 码力 | 359 页 | 1.33 MB | 10 月前3
 Rust语言核心竞争力-庄晓立run(); } fn dynamic_run(r: &Run) { r.run(); } 泛型/Generics,静态分派 http://is.gd/Q2YkAU Trait Object, 动态分派 Static dispatch define internal void @_ZN10static_run21h15769893599831004998E (i32* noalias readonly .all(|_| true); } http://is.gd/9aZTCo • FFI 直接调用C库,运行时零损耗 • Thread 直接使用OS本地线程,无额外管理调度损耗 • FileSystem Network等IO操作 薄薄一层封装,通常唯一对应某个系统API调用 • Closure Inline, Unboxed (No runtime0 码力 | 51 页 | 1.09 MB | 1 年前3 Rust语言核心竞争力-庄晓立run(); } fn dynamic_run(r: &Run) { r.run(); } 泛型/Generics,静态分派 http://is.gd/Q2YkAU Trait Object, 动态分派 Static dispatch define internal void @_ZN10static_run21h15769893599831004998E (i32* noalias readonly .all(|_| true); } http://is.gd/9aZTCo • FFI 直接调用C库,运行时零损耗 • Thread 直接使用OS本地线程,无额外管理调度损耗 • FileSystem Network等IO操作 薄薄一层封装,通常唯一对应某个系统API调用 • Closure Inline, Unboxed (No runtime0 码力 | 51 页 | 1.09 MB | 1 年前3
 Rust 程序设计语言简体中文版# Windows 是 .\main.exe 如果这里的 main.rs 是上文所述的 “Hello, world!” 程序,那么在终端上就会打印出 Hello, world! 。 如果你更熟悉动态语言,如 Ruby、Python 或 JavaScript,则可能不习惯将编译和运行分为两 个单独的步骤。Rust 是一种 预编译静态类型(ahead-of-time compiled)语言,这意味着你可 bound 让我们能够使用泛型类型参数来减少重复,而且能够向编译器明确指定泛 型类型需要拥有哪些行为。然后编译器可以利用 trait bound 信息检查代码中所用到的具体类 型是否提供了正确的行为。在动态类型语言中,如果我们调用了一个未定义的方法,会在运行 时出现错误。Rust 将这些错误移动到了编译时,甚至在代码能够运行之前就强迫我们修复问 题。另外,我们也无需编写运行时检查行为的代码,因为在编译时就已经检查过了。这样既提 信息,在这个例子中是 Guess value must be less than or equal to 100, got 200. 。 expected 信息的选择取决于 panic 信息有多独 特或动态,和你希望测试有多准确。在这个例子中,错误信息的子字符串足以确保函数在 else if value > 100 的情况下运行。 为了观察带有 expected 信息的 should_panic0 码力 | 600 页 | 12.99 MB | 1 年前3 Rust 程序设计语言简体中文版# Windows 是 .\main.exe 如果这里的 main.rs 是上文所述的 “Hello, world!” 程序,那么在终端上就会打印出 Hello, world! 。 如果你更熟悉动态语言,如 Ruby、Python 或 JavaScript,则可能不习惯将编译和运行分为两 个单独的步骤。Rust 是一种 预编译静态类型(ahead-of-time compiled)语言,这意味着你可 bound 让我们能够使用泛型类型参数来减少重复,而且能够向编译器明确指定泛 型类型需要拥有哪些行为。然后编译器可以利用 trait bound 信息检查代码中所用到的具体类 型是否提供了正确的行为。在动态类型语言中,如果我们调用了一个未定义的方法,会在运行 时出现错误。Rust 将这些错误移动到了编译时,甚至在代码能够运行之前就强迫我们修复问 题。另外,我们也无需编写运行时检查行为的代码,因为在编译时就已经检查过了。这样既提 信息,在这个例子中是 Guess value must be less than or equal to 100, got 200. 。 expected 信息的选择取决于 panic 信息有多独 特或动态,和你希望测试有多准确。在这个例子中,错误信息的子字符串足以确保函数在 else if value > 100 的情况下运行。 为了观察带有 expected 信息的 should_panic0 码力 | 600 页 | 12.99 MB | 1 年前3
 Rust 程序设计语言 简体中文版 1.85.0# Windows 是 .\main.exe 如果这里的 main.rs 是上文所述的 “Hello, world!” 程序,那么在终端上就会打印出 Hello, world!。 如果你更熟悉动态语言,如 Ruby、Python 或 JavaScript,则可能不习惯将编译和运行分为两 个单独的步骤。Rust 是一种 预编译静态类型(ahead-of-time compiled)语言,这意味着你可 bound 让我们能够使用泛型类型参数来减少重复,而且能够向编译器明确指定泛 型类型需要拥有哪些行为。然后编译器可以利用 trait bound 信息检查代码中所用到的具体类 型是否提供了正确的行为。在动态类型语言中,如果我们调用了一个未定义的方法,会在运行 时出现错误。Rust 将这些错误移动到了编译时,甚至在代码能够运行之前就强迫我们修复问 题。另外,我们也无需编写运行时检查行为的代码,因为在编译时就已经检查过了。这样既提 信息的子串。我们可以指定期望的整个 panic 信息,在这个例子中是 Guess value must be less than or equal to 100, got 200 。信息的选择取决于 panic 信息 有多独特或动态,和你希望测试有多准确。在这个例子中,错误信息的子字符串足以确保函数 在 else if value > 100 的情况下运行。 为了观察带有 expected 信息的 should_panic0 码力 | 562 页 | 3.23 MB | 26 天前3 Rust 程序设计语言 简体中文版 1.85.0# Windows 是 .\main.exe 如果这里的 main.rs 是上文所述的 “Hello, world!” 程序,那么在终端上就会打印出 Hello, world!。 如果你更熟悉动态语言,如 Ruby、Python 或 JavaScript,则可能不习惯将编译和运行分为两 个单独的步骤。Rust 是一种 预编译静态类型(ahead-of-time compiled)语言,这意味着你可 bound 让我们能够使用泛型类型参数来减少重复,而且能够向编译器明确指定泛 型类型需要拥有哪些行为。然后编译器可以利用 trait bound 信息检查代码中所用到的具体类 型是否提供了正确的行为。在动态类型语言中,如果我们调用了一个未定义的方法,会在运行 时出现错误。Rust 将这些错误移动到了编译时,甚至在代码能够运行之前就强迫我们修复问 题。另外,我们也无需编写运行时检查行为的代码,因为在编译时就已经检查过了。这样既提 信息的子串。我们可以指定期望的整个 panic 信息,在这个例子中是 Guess value must be less than or equal to 100, got 200 。信息的选择取决于 panic 信息 有多独特或动态,和你希望测试有多准确。在这个例子中,错误信息的子字符串足以确保函数 在 else if value > 100 的情况下运行。 为了观察带有 expected 信息的 should_panic0 码力 | 562 页 | 3.23 MB | 26 天前3
 WebAssembly 简介 - 陈思衡解决方案 • 与 WASM 的语言无关。 • 与 CPU 汇编指令无关。 • 可以跨机器调度。 Asyncify(Binaryen) 优点 • 运行效率有所下降。 缺点 Async Wasm 解决方案 Asyncify 跨机器调度 Async Wasm 解决方案 Asyncify 跨机器调度 Async Wasm 解决方案 Thank you!0 码力 | 24 页 | 773.46 KB | 1 年前3 WebAssembly 简介 - 陈思衡解决方案 • 与 WASM 的语言无关。 • 与 CPU 汇编指令无关。 • 可以跨机器调度。 Asyncify(Binaryen) 优点 • 运行效率有所下降。 缺点 Async Wasm 解决方案 Asyncify 跨机器调度 Async Wasm 解决方案 Asyncify 跨机器调度 Async Wasm 解决方案 Thank you!0 码力 | 24 页 | 773.46 KB | 1 年前3
共 22 条
- 1
- 2
- 3













