Comprehensive Rust(简体中文) 202412Rust 中的并发 深入探究 Rust 中的并发 课程为期一天,旨在介绍传统并发和 async/await 并发。 你需要设置一个新 crate,下载所需的依赖项,做好课前准备。然后,你可以将示例复制/粘贴到 src/main.rs 中,以便对以下代码进行实验: cargo init concurrency cd concurrency cargo add tokio --features full when focus is in the text box. 如上所示,大多数代码示例都可修改。少数代码示例可能会因以下原因而不可修改: • 嵌入的 Playground 无法执行单元测试。将代码复制并粘贴到实际 Playground 中,以演示单元测 试。 • 嵌入的 Playground 会在离开页面后丢失编辑状态!因此,学员应使用本地安装的 Rust 或通过 Playground 解题。 (6e9a83356 2023-04-12) 你也可以使用任何更高版本,因为 Rust 保持向后兼容性。 了解这些信息后,请按照以下步骤从本培训中的一个示例中构建 Rust 二进制文件: 1. 在你要复制的示例上点击“复制到剪贴板(Copy to clipboard)”按钮。 2. 使用 cargo new exercise 为代码新建一个 exercise/ 目录: $ cargo new exercise0 码力 | 359 页 | 1.33 MB | 10 月前3
Rust 语言学习笔记译器无法在栈上分配 编译期未知大小 的内存,所以诸如 String, Vec 这些类 型的内存其实是被分配在堆上的。换句话说,我们可以很轻松的将一个 Vec move 出作用域而不必担心消耗,因为数据实际上不会被复制。 对比一下 Vec和 Vec > 内存布局 Vec (stack) (heap) ┌──────┐ ┌───┐ │ vec1 │──→│ 引入 mutex 可能会造成死 锁。); 4.Arc 实际上是一个指针,它不影响包裹对象的方法调用形式(即不存在先解 开包裹再调用值这一说); Arc 对于多线程的共享状态几乎是必须的(减少复制,提高性能) 另外一个例子,多线程读: use std::sync::Arc; use std::thread; fn main() { let numbers: Vec<_> AsMut, Borrow, BorrowMut, ToOwned, Deref, Cow。 其中 Into,From,Cow 不是很常用,简单说明略过。Cow 是借鉴 linux 系统中 的写时复制。 6.6.1 From,Into,Cow From: 对于类型为 U 的对象 foo,如果它实现了 From ,那么,可以通 过 let foo = U::from(bar) 来生成自己。这里,bar 0 码力 | 117 页 | 2.24 MB | 1 年前3
基于 Rust Arrow Flight 的物联网和时序数据传输及转换工具 霍琳贺企业版 云服务版 核心功能开源 • SQL 支持 • 无模式写入 • 缓存 • 流计算 • 数据订阅 • 集群、高可用 高可靠、线性扩展 + 专业技术服务 • 边云数据复制 • 跨云 / 异地数据复制 • 增量备份 • 多级存储 • 工业数据接入 全托管时序数据 管理云服务平台 • 全托管服务 • VPC 对等连接 • 多云部署( AWS/Azure/ GCP) CONTENTS Platform • High Avalibility 2022.12 2023.05 2023.09 Usability Functionality taosX - 集群运维 • 数据库复制 • 全量 / 增量备份 • 数据导入 / 导出 • 数据库迁移 • 异地容灾 taosX - 数据接入 Comming Soon taosX - 流式处理 taosX - Transformer0 码力 | 29 页 | 2.26 MB | 1 年前3
Hello 算法 1.1.0 Rust版据结构可 以动态地添加或删除元素,但它们的容量是固定的。如果数据量超出了预分配的大小,就需要创建一个新的 第 3 章 数据结构 hello‑algo.com 65 更大的数组,并将旧数组的内容复制到新数组中。 Q:在构建栈(队列)的时候,未指定它的大小,为什么它们是“静态数据结构”呢? 在高级编程语言中,我们无须人工指定栈(队列)的初始容量,这个工作由类内部自动完成。例如,Java 的 在复杂的系统环境中,程序难以保证数组之后的内存空间是可用的,从而无法安全地扩展数组容量。因此在 大多数编程语言中,数组的长度是不可变的。 如果我们希望扩容数组,则需重新建立一个更大的数组,然后把原数组元素依次复制到新数组。这是一个 ?(?) 的操作,在数组很大的情况下非常耗时。代码如下所示: // === File: array.rs === /* 扩展数组长度 */ fn extend(nums: VecVec { // 初始化一个扩展长度后的数组 let mut res: Vec = vec![0; nums.len() + enlarge]; // 将原数组中的所有元素复制到新 for i in 0..nums.len() { 第 4 章 数组与链表 hello‑algo.com 72 res[i] = nums[i]; } // 返回扩展后的新数组 res 0 码力 | 388 页 | 18.50 MB | 1 年前3
Hello 算法 1.2.0 简体中文 Rust 版以动态地添加或删除元素,但它们的容量是固定的。如果数据量超出了预分配的大小,就需要创建一个新的 第 3 章 数据结构 www.hello‑algo.com 65 更大的数组,并将旧数组的内容复制到新数组中。 Q:在构建栈(队列)的时候,未指定它的大小,为什么它们是“静态数据结构”呢? 在高级编程语言中,我们无须人工指定栈(队列)的初始容量,这个工作由类内部自动完成。例如,Java 的 在复杂的系统环境中,程序难以保证数组之后的内存空间是可用的,从而无法安全地扩展数组容量。因此在 大多数编程语言中,数组的长度是不可变的。 如果我们希望扩容数组,则需重新建立一个更大的数组,然后把原数组元素依次复制到新数组。这是一个 ?(?) 的操作,在数组很大的情况下非常耗时。代码如下所示: // === File: array.rs === /* 扩展数组长度 */ fn extend(nums: &[i32] Vec{ // 初始化一个扩展长度后的数组 let mut res: Vec = vec![0; nums.len() + enlarge]; // 将原数组中的所有元素复制到新 for i in 0..nums.len() { 第 4 章 数组与链表 www.hello‑algo.com 72 res[i] = nums[i]; } // 返回扩展后的新数组 0 码力 | 387 页 | 18.51 MB | 10 月前3
Hello 算法 1.0.0 Rust版据结构可 以动态地添加或删除元素,但它们的容量是固定的。如果数据量超出了预分配的大小,就需要创建一个新的 第 3 章 数据结构 hello‑algo.com 65 更大的数组,并将旧数组的内容复制到新数组中。 Q:在构建栈(队列)的时候,未指定它的大小,为什么它们是“静态数据结构”呢? 在高级编程语言中,我们无须人工指定栈(队列)的初始容量,这个工作由类内部自动完成。例如,Java 的 在复杂的系统环境中,程序难以保证数组之后的内存空间是可用的,从而无法安全地扩展数组容量。因此在 大多数编程语言中,数组的长度是不可变的。 如果我们希望扩容数组,则需重新建立一个更大的数组,然后把原数组元素依次复制到新数组。这是一个 ?(?) 的操作,在数组很大的情况下非常耗时。代码如下所示: // === File: array.rs === /* 扩展数组长度 */ fn extend(nums: VecVec { // 初始化一个扩展长度后的数组 let mut res: Vec = vec![0; nums.len() + enlarge]; // 将原数组中的所有元素复制到新 for i in 0..nums.len() { 第 4 章 数组与链表 hello‑algo.com 72 res[i] = nums[i]; } // 返回扩展后的新数组 res 0 码力 | 383 页 | 17.61 MB | 1 年前3
Rust 程序设计语言简体中文版为了演示所有权的规则,我们需要一个比第三章 “数据类型” 中讲到的都要复杂的数据类型。 前面介绍的类型都是已知大小的,可以存储在栈中,并且当离开作用域时被移出栈,如果代码 的另一部分需要在不同的作用域中使用相同的值,可以快速简单地复制它们来创建一个新的独 立实例。不过我们需要寻找一个存储在堆上的数据来探索 Rust 是如何知道该在何时清理数据 的。 我们会专注于 String 与所有权相关的部分。这些方面也同样适用于标准库提供的或你自己创 从分配器总共获取了多 少字节的内存。长度与容量的区别是很重要的,不过在当前上下文中并不重要,所以现在可以 忽略容量。 当我们将 s1 赋值给 s2 ,String 的数据被复制了,这意味着我们从栈上拷贝了它的指针、 长度和容量。我们并没有复制指针指向的堆上数据。换句话说,内存中数据的表现如图 4-2 所 示。 图 4-2:变量 s2 的内存表现,它有一份 s1 指针、长度和容量的拷贝 这个表现形式看起来 是有效的,当其离开作用域,它就释放自己的内存, 完毕。 另外,这里还隐含了一个设计选择:Rust 永远也不会自动创建数据的 “深拷贝”。因此,任何 自动 的复制都可以被认为是对运行时性能影响较小的。 变量与数据交互的方式(二):克隆 如果我们 确实 需要深度复制 String 中堆上的数据,而不仅仅是栈上的数据,可以使用一个 叫做 clone 的通用函数。第五章会讨论方法语法,不过因为方法在很多语言中是一个常见功0 码力 | 600 页 | 12.99 MB | 1 年前3
Rust 程序设计语言 简体中文版 1.85.0为了演示所有权的规则,我们需要一个比第三章 “数据类型” 中讲到的都要复杂的数据类型。 前面介绍的类型都是已知大小的,可以存储在栈中,并且当离开作用域时被移出栈,如果代码 的另一部分需要在不同的作用域中使用相同的值,可以快速简单地复制它们来创建一个新的独 立实例。不过我们需要寻找一个存储在堆上的数据来探索 Rust 是如何知道该在何时清理数据 的,而 String 类型就是一个很好的例子。 我们会专注于 String 与所有权 从分配器总共获取了多少 字节的内存。长度与容量的区别是很重要的,不过在当前上下文中并不重要,所以现在可以忽 略容量。 当我们将 s1 赋值给 s2,String 的数据被复制了,这意味着我们从栈上拷贝了它的指针、长 度和容量。我们并没有复制指针指向的堆上数据。换句话说,内存中数据的表现如图 4-2 所 示。 72/562Rust 程序设计语言 简体中文版 s1 name value ptr len 这样就解决了我们的问题!因为只有 s2 是有效的,当其离开作用域,它就释放自己的内存, 完毕。 另外,这里还隐含了一个设计选择:Rust 永远也不会自动创建数据的 “深拷贝”。因此,任何 自动的复制都可以被认为是对运行时性能影响较小的。 作用域与赋值 作用域、所有权和通过 drop 函数释放内存之间的关系反过来也同样成立。当你给一个已有的 变量赋一个全新的值时,Rust 将会立即调用 drop0 码力 | 562 页 | 3.23 MB | 24 天前3
新一代分布式高性能图数据库的构建 - 沈游人CCF 科 学技术奖科技进步卓越奖”。 伴随市场对于知识图谱应用的不断深入,图数据规模和应用性能之间的矛盾愈 加凸显,海致针对以上背景展开了系统性的技术攻关,解决了图数据的高效存 储、索引及复制难题,提出了基于图缩减的高效分析方法,并孵化出了一个大 规模图数据分析平台 AtlasGraph 。 5 获得 2022 年中国电子学会科学技术奖科技进步一等奖 中国电子学会发布的《 20220 码力 | 38 页 | 24.68 MB | 1 年前3
共 9 条
- 1













