恋爱脑学Rust之并行之旅:Rayon介绍和使用

在这里插入图片描述

文章目录

    • 一、开启爱情的依赖之旅(安装 Rayon)
    • 二、甜蜜瞬间的并行享受(基本数据并行操作)
      • (一)共享美好时光(`par_iter` 方法)
      • (二)分块珍藏回忆(`par_chunks` 方法)
    • 三、各自梦想的并行追逐(任务并行)
      • (一)梦想的启航(`spawn` 和 `join`)
    • 四、定制爱情的相处模式(自定义并行策略)
    • 五、携手应对生活的挑战(与其他 Rust 特性结合使用)
      • (一)守护爱情的港湾(与 `Arc` 和 `Mutex` 结合)
    • 六、爱情旅程中的平衡艺术(性能考虑)
      • (一)分担与陪伴(负载均衡)
      • (二)独立与融合(线程开销)
      • (三)理解与包容(共享数据的同步成本)

在一个宁静而又充满诗意的小镇上,住着两位年轻人,男孩叫艾克,女孩叫莉娜。他们的爱情就如同一段需要精心编排的旅程,而 Rayon 就像是他们在这段旅程中掌握的特殊魔法,帮助他们更好地处理爱情中的各种“任务”与“数据”。

一、开启爱情的依赖之旅(安装 Rayon)

他们的爱情故事开始于一个特殊的时刻,就像在 Rust 项目中决定引入 Rayon 一样,他们彼此确认了眼神,决定将对方纳入自己的生命旅程。这一决定就如同在 Cargo.toml 文件中写下 rayon = "1.6.1",是他们爱情故事开启并行篇章的重要一步。然后,随着时间的推移,他们在日常相处中不断地构建和巩固这份感情,就像运行 cargo build 一样,让爱情的基础逐渐稳固。

在这个阶段,就如同在 Rust 项目中配置 Rayon 依赖,以下是简单的示例代码:

// 在 Cargo.toml 中添加依赖
[dependencies]
rayon = "1.6.1"

二、甜蜜瞬间的并行享受(基本数据并行操作)

(一)共享美好时光(par_iter 方法)

他们常常一起度过许多美好的时光,比如漫步在小镇的花海中。每一朵花就像是爱情中的一个元素,而他们想要一起感受每一朵花带来的美好。艾克和莉娜会用一种特殊的方式,就像 par_iter 方法一样,并行地去品味这些美好瞬间。例如,他们会同时对看到的每一处风景进行内心的“映射”,将这些风景在心中转化为甜蜜的回忆。如果把他们看到的风景序列看作是一个向量,那么他们会并行地对这个向量中的每个元素(每一处风景)进行处理,让每一个瞬间都以独特的方式在心中留下深刻的印记,最后把这些美好的回忆收集起来,成为他们爱情记忆宝库中的璀璨明珠。

以下是对应的 Rust 代码示例:

use rayon::prelude::*;
let v = vec![1, 2, 3, 4, 5];
// 并行迭代向量 v,对每个元素进行平方运算
let squared: Vec<_> = v.par_iter().map(|&x| x * x).collect();
println!("{:?}", squared);

在这个例子中,par_iter 方法将向量 v 的迭代操作并行化。map 函数用于对每个元素应用一个闭包(这里是计算元素的平方),最后 collect 方法将结果收集到一个新的向量中,就如同艾克和莉娜将对每一处风景的美好感受收集起来。

(二)分块珍藏回忆(par_chunks 方法)

有时候,他们的爱情回忆太过丰富,就像一个巨大的向量数据。这时,他们会采用一种特殊的策略,如同 par_chunks 方法。他们会把这些回忆按照时间或者情感的片段分成一个个的“块”。比如,把他们相识初期的回忆分成一块,热恋期的回忆分成另一块。然后,他们会并行地对每个块进行处理,像是对每一块回忆进行深度的总结和回味,计算每一块回忆中那些特别的“情感和”,最后把这些关于每一块回忆的感悟收集起来,成为他们对爱情不同阶段更深刻理解的见证。

对应的 Rust 代码如下:

use rayon::prelude::*;
let v: Vec<i32> = (0..1000).collect();
let chunk_size = 100;
// 将向量 v 分割成大小为 chunk_size 的块,并行计算每个块的元素和
let sums: Vec<_> = v.par_chunks(chunk_size).map(|chunk| chunk.iter().sum()).collect();
println!("{:?}", sums);

这里,v.par_chunks(chunk_size) 将向量 v 分割成大小为 chunk_size 的块,然后 map 函数对每个块应用求和操作,就像他们对每一段爱情回忆块进行总结,最后将所有块的和收集到 sums 向量中,如同收集对爱情不同阶段的感悟。

三、各自梦想的并行追逐(任务并行)

(一)梦想的启航(spawnjoin

艾克和莉娜除了爱情,也有着各自的梦想。艾克梦想着成为一名优秀的画家,而莉娜渴望成为一名出色的音乐家。他们明白,在爱情的道路上,也可以并行地追逐自己的梦想。就像在 Rayon 中使用 spawn 函数一样,他们各自勇敢地踏上了梦想的征程,开启了独立的“任务”。艾克在他的画室里挥洒着画笔,描绘着他心中的世界;莉娜在她的琴房里弹奏着音符,奏响她心中的旋律。而他们也知道,无论各自的梦想之旅走得多远,最终都要像 join 函数所做的那样,回到彼此的身边,将各自梦想中的收获与对方分享,让爱情因为梦想的滋养而更加绚烂。

以下是相关的 Rust 代码示例:

use rayon::prelude::*;
fn fibonacci(n: u32) -> u32 {if n <= 1 {n} else {fibonacci(n - 1) + fibonacci(n - 2)}
}
fn main() {// 并行启动两个任务,分别计算斐波那契数列的第 30 项和第 35 项let handle1 = rayon::spawn(|| fibonacci(30));let handle2 = rayon::spawn(|| fibonacci(35));let result1 = handle1.join().unwrap();let result2 = handle2.join().unwrap();println!("Fibonacci 30: {}, Fibonacci 35: {}", result1, result2);
}

在这个例子中,rayon::spawn 创建了两个并行任务,分别计算斐波那契数列的第 30 项和第 35 项,就像艾克和莉娜分别开启自己的梦想之旅。join 函数用于等待任务完成并获取结果,如同他们在梦想之旅后回到彼此身边分享收获。

四、定制爱情的相处模式(自定义并行策略)

在他们的爱情相处中,他们也意识到需要根据彼此的需求和情况来定制相处的模式,这就如同 Rayon 中的自定义并行策略。他们会像使用 ThreadPoolBuilder 一样,精心构建他们爱情的“线程池”。例如,他们会商量好每周有多少时间可以各自专注于自己的事业或者兴趣爱好(设定线程池大小),然后在这些时间里,他们可以放心地去做自己的事情,就像在定制的线程池中执行并行操作。而在其他时间里,他们又会全身心地投入到彼此的陪伴中,让爱情在有张有弛的节奏中稳步前行。

对应的 Rust 代码如下:

use rayon::ThreadPoolBuilder;
// 创建一个线程池,设置线程数量为 4
let pool = ThreadPoolBuilder::new().num_threads(4).build().unwrap();
let v = vec![1, 2, 3, 4, 5];
// 在自定义的线程池中并行迭代向量 v,对每个元素进行平方运算
let squared: Vec<_> = pool.install(|| v.par_iter().map(|&x| x * x).collect());
println!("{:?}", squared);

这里,通过 ThreadPoolBuilder 创建了一个线程池,然后使用 install 方法在这个线程池中执行并行操作,就如同他们根据商量好的时间安排来进行各自的活动与陪伴。

五、携手应对生活的挑战(与其他 Rust 特性结合使用)

(一)守护爱情的港湾(与 ArcMutex 结合)

生活中难免会有一些挑战和困难,就像在编程中处理共享可变数据一样。他们共同拥有一个“爱情计数器”,这个计数器象征着他们爱情中的幸福指数。为了确保这个计数器能够正确地被更新,他们采用了一种特殊的方式,就像使用 Arc(原子引用计数)和 Mutex(互斥锁)的组合。每当他们一起度过一个美好的时光,比如一次浪漫的约会或者一次互相帮助的经历,他们就会像获取互斥锁一样,小心翼翼地对这个爱情计数器进行加 1 操作。无论是谁在进行这个操作,都要先确保不会与对方的操作冲突,就像多个线程通过 lock 方法获取互斥锁一样。这样,他们就能准确地记录下爱情中的每一份幸福,守护好他们爱情的港湾。

以下是相关的 Rust 代码示例:

use std::sync::{Arc, Mutex};
use rayon::prelude::*;
// 创建一个被 Arc 和 Mutex 包裹的计数器
let counter = Arc::new(Mutex::new(0));
let mut handles = vec![];
for _ in 0..10 {let counter = Arc::clone(&counter);// 并行启动任务,对计数器进行加 1 操作let handle = rayon::spawn(move || {let mut num = counter.lock().unwrap();*num += 1;});handles.push(handle);
}
for handle in handles {handle.join().unwrap();
}
// 输出计数器的值
println!("Counter value: {}", *counter.lock().unwrap());

在这个例子中,Arc 用于共享 Mutex 包裹的计数器,每个并行任务通过 lock 方法获取互斥锁,然后对计数器进行加 1 操作,如同他们在爱情中共同维护幸福指数,最后打印出计数器的值,就像他们回顾爱情中的幸福积累。

六、爱情旅程中的平衡艺术(性能考虑)

(一)分担与陪伴(负载均衡)

在爱情里,他们也懂得平衡的重要性,就像 Rayon 中的负载均衡。有时候,艾克可能会面临工作上的压力,就像处理数据量较大的任务,而莉娜会主动分担一些生活中的琐事,让艾克不会因为压力过大而疲惫不堪。反之,当莉娜在音乐创作上遇到瓶颈时,艾克也会陪伴在她身边,给予支持和鼓励。他们通过合理的分工,就像合理地划分数据块一样,确保彼此在爱情的旅程中不会因为某一方的压力过重而出现“空闲”或者“崩溃”,让爱情始终保持稳定的步伐。

在代码层面,例如在处理一个复杂的计算任务(类似爱情中的压力源),如果可以合理地将任务分解成多个子任务(就像他们合理分工生活琐事与工作压力分担),可以提高整体的效率和稳定性。假设他们有一个计算任务是处理一个大型数组的元素求和:

use rayon::prelude::*;
let v: Vec<i32> = (0..10000).collect();
// 将数组分成合适的块进行并行求和,这里假设分成 10 块(可根据实际情况调整)
let chunk_size = 1000;
let sums: Vec<_> = v.par_chunks(chunk_size).map(|chunk| chunk.iter().sum()).collect();
let total_sum: i32 = sums.iter().sum();
println!("Total sum: {}", total_sum);

通过合理地选择 chunk_size,可以平衡各个“线程”(他们各自在爱情中的精力投入)的负载,避免某个“线程”过度劳累或闲置。

(二)独立与融合(线程开销)

他们明白,虽然彼此相爱,但也需要有各自的独立空间,就像在 Rayon 中要考虑线程开销一样。过多的干涉和依赖就像过度细粒度的任务,会让爱情变得疲惫和沉重。所以,他们会在适当的时候给彼此足够的自由,让各自的个性和兴趣得以发展,避免因为过度的“线程切换”(频繁地互相干涉)而影响爱情的“性能”。但同时,他们也知道,爱情需要适度的融合,就像合理的任务并行一样,在重要的时刻,他们会毫不犹豫地走到一起,共同面对生活中的喜怒哀乐。

从代码角度看,如果在一个并行任务中创建过多的小任务(类似过度干涉对方的生活),会增加线程创建和切换的开销。例如:

use rayon::prelude::*;
let v: Vec<i32> = (0..100).collect();
// 不要过度创建小任务,比如不要这样做(错误示例)
// for num in v {
//     rayon::spawn(move || {
//         // 一些简单操作
//         let result = num * 2;
//         println!("Result: {}", result);
//     });
// }
// 而是可以采用合适的并行方式,如
let doubled: Vec<_> = v.par_iter().map(|&x| x * 2).collect();
println!("{:?}", doubled);

这样可以减少不必要的“线程开销”,让爱情(代码执行)更加高效和稳定。

(三)理解与包容(共享数据的同步成本)

在处理彼此的情绪和想法时,就像处理共享可变数据,他们知道这需要付出一定的“同步成本”。当艾克因为工作上的挫折而情绪低落时,莉娜需要花费时间和精力去理解他、包容他,就像在处理共享数据时要等待互斥锁的释放一样。同样,当莉娜在音乐比赛失利而沮丧时,艾克也要耐心地陪伴她度过难关。他们明白,这种理解和包容虽然需要付出努力,但却是爱情长久稳定的关键,就像合理优化共享数据的同步操作可以提高程序性能一样,良好的理解与包容可以让他们的爱情更加坚不可摧。

在代码示例中,如之前提到的 ArcMutex 结合的计数器例子,虽然互斥锁可以保证数据的正确性,但频繁地获取和释放锁(类似在爱情中频繁地要求对方理解而不考虑对方的感受)会降低性能。所以他们在爱情中学会在合适的时机进行沟通和理解,就像在代码中优化锁的使用范围和频率一样,例如:

use std::sync::{Arc, Mutex};
use rayon::prelude::*;
let counter = Arc::new(Mutex::new(0));
let mut handles = vec![];
// 可以减少不必要的锁获取,比如先收集任务,再统一执行
for _ in 0..10 {let counter = Arc::clone(&counter);let handle = rayon::spawn(move || {// 先进行一些本地计算或操作,减少锁的持有时间let local_result = 1;let mut num;{num = counter.lock().unwrap();*num += local_result;}});handles.push(handle);
}
for handle in handles {handle.join().unwrap();
}
println!("Counter value: {}", *counter.lock().unwrap());

这样可以降低共享数据的同步成本,提高爱情(程序)的整体“性能”。

艾克和莉娜在他们的爱情故事里,巧妙地运用着如同 Rayon 般的智慧,让爱情在并行与同步、独立与融合、分担与陪伴中不断地成长和升华,书写着属于他们的美好爱情篇章。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/63776.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

素数对

素数对 C语言代码C 代码Java代码Python代码 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 两个相差为2的素数称为素数对&#xff0c;如5和7&#xff0c;17和19等&#xff0c;本题目要求找出所有两个数均不大于n的素数对。 输入 一个正整…

cpptoml介绍

cpptoml 是一个用于 C 的开源库&#xff0c;旨在提供对 TOML&#xff08;Toms Obvious, Minimal Language&#xff09;格式的支持。它允许开发者轻松地在 C 项目中读取、解析和生成 TOML 格式的配置文件。cpptoml 是一个轻量级、易于使用的库&#xff0c;适用于那些希望将 TOML…

公有云和私有云的区别

目录 ​1、公有云&#xff08;PublicClouds&#xff09; ​2、私有云&#xff08;PrivateClouds&#xff09; ​2.1 私有云又分为两种 3、混合云&#xff08;hybrid cloud&#xff09; ​3.1 公有云和私有云的区别 ​3.2 选择公有云或者是私有云 4 政务云&#xff08;Go…

嵌入式硬件-- 元器件焊接

1.锡膏的使用 锡膏要保存在冰箱里。 焊接排线端子&#xff1b;138度的低温锡&#xff08;锡膏&#xff09;&#xff0c; 第一次使用&#xff0c;直接拿东西挑一点涂在引脚上&#xff0c;不知道多少合适&#xff0c;加热台加热到260左右&#xff0c;放在上面观察锡融化&#…

六、nginx负载均衡

负载均衡&#xff1a;将四层或者七层的请求分配到多台后端的服务器上。 从而分担整个业务的负载。提高系统的稳定性&#xff0c;也可以提高高可用&#xff08;备灾&#xff0c;其中一台后端服务器如果发生故障不影响整体业务&#xff09;. 负载均衡的算法 round robin 轮询 r…

【C++算法】40.模拟_N 字形变换

文章目录 题目链接&#xff1a;题目描述&#xff1a;解法C 算法代码&#xff1a; 题目链接&#xff1a; 6. N 字形变换 题目描述&#xff1a; 解法 解法一&#xff1a;模拟 a,b,c,d,e,f,g...... n4 弄个矩阵放进去&#xff0c;最后从左往右读取。 解法二&#xff1a;模拟优化-…

访问者模式的理解和实践

在软件开发过程中&#xff0c;设计模式为我们提供了解决常见问题的最佳实践。访问者模式&#xff08;Visitor Pattern&#xff09;是行为设计模式之一&#xff0c;它将数据操作与数据结构分离&#xff0c;使得在不修改数据结构的前提下&#xff0c;能够定义作用于这些元素的新的…

Jenkins:持续集成与持续部署的利器

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《未来已来&#xff1a;云原生之旅》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、什么是Jenkins 2、Jenkins的起源 二、Jenkins的核心…

java中的数组(4)

大家好&#xff0c;今天是java数组的最后一篇&#xff0c;我来为大家介绍数组中一些常见用法&#xff0c;那么我们直接发车。 五.作为函数的返回值. 1数组对象在堆上,不会因为局部变量的销段而销毁. 2.new开辟新空间. 3.数组对象是在堆上的. 4.引用变量目前是在main函数里…

从SRE视角透视DevOps的构建精髓

SRE 侧重系统稳定性&#xff0c;DevOps 强调开发运维协作。SRE 实践助力DevOps&#xff0c;提升系统稳定性与团队协作效率。 SRE 运用软件工程的原理&#xff0c;将系统管理员的手工任务自动化&#xff0c;负责运维由系统组件构成的服务&#xff0c;确保服务稳定运行。SRE职责涵…

关于Redis哨兵机制实验操作步骤

需要搭建帮助的可以去taobao搜索Easy Company技术服务&#xff0c;谢谢&#xff01;&#xff01;&#xff01; 需要搭建帮助的可以去taobao搜索Easy Company技术服务&#xff0c;谢谢&#xff01;&#xff01;&#xff01; 一、配置哨兵(sentinel) 创建三个哨兵配置文件&…

基于51单片机的智能门禁系统设计与实现

1. 项目背景与需求分析 随着社会的不断发展&#xff0c;智能化门禁系统在现代安全领域应用越来越广泛。智能门禁系统通过单片机的控制功能&#xff0c;结合指纹模块和液晶显示模块&#xff0c;能够实现便捷、高效、安全的身份认证管理。基于STC89C52单片机的设计&#xff0c;具…

【大前端vue:组件】vue鼠标滑动:平滑滚动效果 向左、向右

【大前端vue&#xff1a;组件】vue鼠标滑动&#xff1a;平滑滚动效果 向左、向右 <template><div class"tab-container"><div class"tab-wrapper"><h2 class"main-title">鼠标滑动&#xff1a;平滑滚动效果 向左、向右…

某养老产业公司管理诊断项目成功案例纪实

某养老产业公司管理诊断项目成功案例纪实 ——从短期和长期出发&#xff0c;提供转型改革建议 【客户行业】养老行业 【问题类型】问题诊断 【客户背景】 某养老产业公司是一家主要从事养老服务为主的企业&#xff0c;主营业务包括社区养老服务、居家养老、康复训练服务等…

Python的3D可视化库【vedo】1-4 (visual模块) 体素可视化、光照控制、Actor2D对象

文章目录 6. VolumeVisual6.1 关于体素6.2 显示效果6.2.1 遮蔽6.2.2 木纹或磨砂效果 6.3 颜色和透明度6.3.1 透明度衰减单位6.3.2 划分透明度标量梯度6.3.3 设置颜色或渐变6.3.4 标量的计算模式6.3.5 标量的插值方式 6.4 过滤6.4.1 按单元格id隐藏单元格6.4.2 按二进制矩阵设置…

DAY5 C++运算符重载

1.类实现> 、<、!、||、&#xff01;和后自增、前自减、后自减运算符的重载 代码&#xff1a; #include <iostream>using namespace std; class Complex {int rel;int vir; public:Complex(){};Complex(int rel,int vir):rel(rel),vir(vir){cout << "…

qt 封装 调用 dll

这个目录下 &#xff0c;第一个收藏的这个 &#xff0c;可以用&#xff0c; 但是有几个地方要注意 第一.需要将dll的头文件添加到qt的文件夹里面 第二&#xff0c;需要在pro文件里面添加动态库路径 第三&#xff0c;如果调用dll失败&#xff0c;那么大概需要将dll文件放在e…

hbuilder 安卓app手机调试中基座如何设置

app端使用基座 手机在线预览功能 1.点击运行 2.点击运行到手机或者模拟器 3.制作自定义调试基座 4.先生成证书【可以看我上一篇文档写的有】&#xff0c;点击打包 5.打包出android自定义调试基座【android_debug.apk】,【就跟app打包一样需要等个几分钟】 6.点击运行到手…

快速将请求头构建成json结构

1.背景 有时候我们要爬虫(组包)请求一个资源数据,需要构建与原始请求一样的请求头,从浏览器复制过来的请求头,有很多,如果一个一个的配置成json有点慢,那么如何快速构建呢? 今天就使用正则表达式的方式实现 正则表达式实现快速将请求头构建成json结构 将冒号后边的换行符去掉…

Flink如何基于数据版本使用最新离线数据

业务场景 假设批量有一张商户表&#xff0c;表字段中有商户名称和商户分类两个字段。 批量需要将最新的商户名称和分类的映射关系推到hbase供实时使用。 原实现方案 a.原方案内容 为解决批量晚批问题&#xff0c;批量推送hbase表时一份数据产生两类rowkey&#xff1a;T-1和…