恋爱脑学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 般的智慧,让爱情在并行与同步、独立与融合、分担与陪伴中不断地成长和升华,书写着属于他们的美好爱情篇章。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数据库系列】PostgreSQL 数据库连接

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

中介者模式的理解和实践

一、中介者模式概述 中介者模式&#xff08;Mediator Pattern&#xff09;&#xff0c;也称为调解者模式或调停者模式&#xff0c;是一种行为设计模式。它的核心思想是通过引入一个中介者对象来封装一系列对象之间的交互&#xff0c;使得这些对象不必直接相互作用&#xff0c;从…

吸烟抽烟行为识别数据集-超高识别率,支持YOLO,COCO,VOC格式的标注,10162张各种姿势场景下的吸烟图片

吸烟抽烟行为识别数据集-超高识别率&#xff0c;支持YOLO&#xff0c;COCO,VOC格式的标注&#xff0c;10162张各种姿势场景下的吸烟图片 数据集分割 训练组91&#xff05; 9279图片 有效集5&#xff05; 507图片 测试集4% 376图片 预处理 自动定…

【开源】基于SpringBoot框架的房屋租赁系统 (计算机毕业设计)+万字毕业论文 T020

系统合集跳转 源码获取链接 一、系统环境 运行环境: 最好是java jdk 1.8&#xff0c;我们在这个平台上运行的。其他版本理论上也可以。 IDE环境&#xff1a; Eclipse,Myeclipse,IDEA或者Spring Tool Suite都可以 tomcat环境&#xff1a; Tomcat 7.x,8.x,9.x版本均可 操作系统…

C++20 标准概念

1. 所有标准概念的概述 “类型和对象基本概念”表列出了类型和对象的基本概念。 “范围、迭代器和算法概念”表列出了范围、视图、迭代器和算法的概念。 “辅助概念”表列出的概念主要用作其他概念的构建块&#xff0c;通常不会让应用程序开发者直接使用。 头文件和命名空间 …

git的卸载与安装

目录 一、Git的卸载 二、Git的安装 2.1.1 官网下载 2.1.2 镜像下载 ​编辑 2.2 安装 2.3 检验否安装成功 三、Git使用配置 一、Git的卸载 1.找到程序&#xff0c;卸载程序 2.找到Git&#xff0c;右键卸载 卸载完成&#xff01; 二、Git的安装 2.1.1 官网下载 网址&…

科技赋能电影,互动电影开启电影新格局

近年来&#xff0c;科技赋能电影&#xff0c;让电影越来越精彩&#xff0c;也越来越多元。层出不穷的新技术新类型&#xff0c;不断丰富着电影视听语言的表现形式&#xff0c;也为观众带来更多具有交互性和个性化的观影体验。进昂互动科技在推出全球首部院线互动电影《夜班》之…

python 下载 b站视频 和音频

video_bvid&#xff1a; import os import requests import json import re from bs4 import BeautifulSoup import subprocess # from detail_video import video_bvid# video_bvid 是一个从外部得到的单个视频ID video_bvid BV1cx421Q7veclass BilibiliVideoAudio:def __in…

操作系统:虚拟存储系统

目录 1、外存资源管理 外存空间划分 进程与外存对应关系 2、虚拟页式存储系统 3、 淘汰算法&#xff08;重点&#xff09;P217 最佳淘汰算法&#xff08;OPT&#xff09; 先进先出(FIFO) 最近最少使用算法&#xff08;LRU&#xff09; 最近不用的先淘汰(LNU) 最不经常…

Linux24.04 安装企业微信

今天工作需要把windows系统换成了linux&#xff0c;但是公司的沟通工具是企业微信。去企业微信官网看了&#xff0c;没有linux版本&#xff0c;只能想办法解决了&#xff0c;不然再换回去就太坑了。 方案 1、使用docker容器&#xff0c;2、使用deepin-wine 本人对docker不太熟…

手机实时提取SIM卡打电话的信令声音--社会价值(一、方案解决了什么问题)

手机实时提取SIM卡打电话的信令声音 --社会价值(一、方案解决了什么问题) 一、前言 这段时间&#xff0c;我们在技术范围之外陷入了一个自证或者说下定义的怪圈&#xff0c;即要怎么样去介绍或者描述&#xff1a;我们是一个什么样的产品。它在当前这个世界上&#xff0c;处于…

UnityShaderLab 实现黑白着色器效果

实现思路&#xff1a;取屏幕像素的RGB值&#xff0c;将三个通道的值相加&#xff0c;除以一个大于值使颜色值在0-1内&#xff0c;再乘上一个强度值调节黑白强度。 在URP中实现需要开启Opaque Texture ShaderGraph实现&#xff1a; ShaderLab实现&#xff1a; Shader "Bl…

Burp suite2 (泷羽sec)

声明 学习视频来自B站UP主 泷羽sec,如涉及侵泷羽sec权马上删除文章。 笔记只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 这节课旨在扩大自己在网络安全方面的知识面&#xff0c;了解网络安全领域的见闻&#xff0c;了…

Devops-蓝鲸篇-01-蓝鲸智云简介

官方社区 蓝鲸智云学习社区&#xff1a;https://bk.tencent.com/s-mart/communities 蓝鲸简介 腾讯蓝鲸智云&#xff0c;简称蓝鲸&#xff0c;是腾讯互动娱乐事业群&#xff08;Interactive Entertainment Group&#xff0c;简称 IEG&#xff09;基于海量异构业务自研的一套…

9. 高效利用Excel设置归档Tag

高效利用Excel设置归档Tag 1. Excle批量新建/修改归档Tag2. 趋势记录模型批量导入归档Tag(Method1)2. 趋势记录模型批量导入归档Tag(Method2)3. 趋势记录控件1. Excle批量新建/修改归档Tag Fcatory Talk常常需要归档模拟量,对于比较大的项目工程会有成千上万个重要数据需…

未来已来:人工智能如何重塑我们的生活与工作

引言 未来的生活和工作场景正从想象走向现实。想象一下&#xff0c;一个清晨&#xff0c;语音助手已经为你安排好一天的任务&#xff0c;自动驾驶汽车准时送你上班&#xff0c;智能冰箱提醒你需要补充的食材。曾经只存在于科幻小说中的场景&#xff0c;如今正在我们的身边实现。…

Ai编程从零开始部署Node项目接口开发之云服务器ECS安装部署mysql(十四)

云风网 云风笔记 云风知识库 为了体验基本的增删改查功能&#xff0c;用户注册/登录/用户列表查询展示/删除用户等接口开发是必要的&#xff0c;这里采用node项目开发部署。如果想要简便&#xff0c;可以采用宝塔运维面板。这里直接官网下载安装包部署云服务器 一、mysql官网下…

jmeter调整字号无法生效?

调整之前如上图&#xff0c;字体非常小&#xff0c;哪怕我设置的字号是48 查阅了资料&#xff0c;试了几次&#xff0c;解决办法如下&#xff1a; 用编辑器打开jmeter.bat 在echo off的下一行添加以下代码 set JVM_ARGS%JVM_ARGS% -Dswing.plaf.metal.controlFontDialog-20…

使用 mkcert 工具自签发 https 证书并进行本地受信

介绍 mkcert 是一个用于创建本地受信任的 SSL/TLS 证书的简单工具&#xff0c;特别适合开发者在本地环境中使用。它解决了为开发和测试目的创建自签名证书时遇到的信任问题。以下是关于 mkcert 的详细介绍&#xff1a; 特点 易用性&#xff1a;只需一条命令即可生成证书&…

视频推拉流EasyDSS无人机直播技术巡查焚烧、烟火情况

焚烧作为一种常见的废弃物处理方式&#xff0c;往往会对环境造成严重污染。因此&#xff0c;减少焚烧、推广绿色能源和循环经济成为重要措施。通过加强森林防灭火队伍能力建设与长效机制建立&#xff0c;各地努力减少因焚烧引发的森林火灾&#xff0c;保护生态环境。 巡察烟火…