并行集合运算的应用案例 | 学习笔记

简介: 快速学习并行集合运算的应用案例

开发者学堂课程【Scala 核心编程 - 进阶并行集合运算的应用案例学习笔记,与课程紧密连接,让用户快速学习知识。

课程地址https://developer.aliyun.com/learning/course/610/detail/9064


并行集合运算的应用案例

 

内容介绍

一、打印1~5

二、查看并行集合中元素访问的线程

三、并行集合的基本介绍


一、打印1~5

新建一个文件,命名为 ParDemo1

def main(args:Array[string]): unit = {

(1 to 5).foreach(println(_))    

//’_’写或者不写是等价的,这里的’_’代表从一到五取出的指针区域,’_’也可以不写,

不写的话 foreach 也会默认把一到五传给 println  ,写上就明确地把遍历的内容传给 println ,这样理解得更深刻了。

println()

//这里输出的结果是无序的,原因是每个数的打印速度不同,说明是将 println 任务分配给不同 cpu ,调用 println 充分利用了 cpu ,体现了并行运算的特点。

(1 to 5).par.foreach(println(_))

}

运行以后结果:

image.png

假如以后遇到一个很大的集合,每个数据都要计算,然后得到一个新的集合,这时在前面加上 par 就很简单,它都支持。

比如之前讲的 list 也适用。

val list = list(1,2,3,4,5)

list.par.map( )  

//对 list 里的元素进行 map 运算是多核进行,速度会更快,有兴趣的话可以把数换成更大的,用 for 循环弄上一百万个,然后让 map 里面再循环多点,运行后会发现运行速度会更快,比如说有四个和,加上 par 会快四倍。


二、查看并行集合中元素访问的线程

由于代码简单,为了避免两个代码写到一起,直接新建一个小文件,命名为 Pardemo02 ,快速运行一下。

defmain(args:Array[string]):unit= { Valresult1=(0to100).map{case_=>Thread.currentThread.getName}.distinct //distinct

用来去重,使效果看起来更明显。

Valresult2=(0to100).par.map{case_=>Thread.currentThread

getName}.distinct

println(result1)//非并行

println(“-------------------------------------------------------”)//为了方便区别,添加间隔线。

println(result2)//并行

}

这段代码是从零到一百进行遍历,然后输出当前线程的名字是多少个。

image.png

运行一下发现:

第一种运行了大约一百次,只用了一个线程也就是主线程,第二种由于有四个和,因此则用了四个线程,如果有八个和,则有八个线程。表明第一种的运行时间是第二种的四倍,也就是第二种比第一种快四倍,因此并行比非并行效率更高,因此写代码时要充分利用 par .


三、并行集合的基本介绍

以后要充分利用并行集合,这样的话能提高效率,从语言程序上一改就好,不用费力地从整体结构去改,整体结构的改正一般是迫不得已才改,尽量在原始程序上改。

这是并行集合的基本介绍:

1.Scala 为了充分使用多核 CPU ,提供了并行集合(有别于前面的串行集合),用于多核环境的并行计算。

2.主要用到的算法有:

Divide and conguer 分治算法, Scala 通过 splitters (分解器),

combiners (组合器)等抽象层来实现,主要原理是将计算工作分解很

多任务,分发给一些处理器去完成,并将它们处理结果合并返回

Workstealin 算法【学数学】,主要用于任务调度负载均衡 (load-

balancing) ,通俗点完成自己的所有任务之后,发现其他人还有活没干完,主动(或被安排)帮他人一起干,这样达到尽早干完的目的。

然后接下来讲了两个应用案例:

>打印 1~5

(1 to5).foreach(println(()) printlno

(1to 5).par.foreach(println(())

>查看并行集合中元素访问的线程

object ParDemo02 {

def main(args: Array[String]): Unit={

val result1=(0 to 100).map{case_=>Thread.currentThreadgetName.distinct

val result2=(0 to 100).parmap{case_=> Thread.currentThreadgetNamedistinct println(result1)

//非并行

println("--------------------------------------------") println(result2) //并行}

}

相关文章
|
小程序 前端开发 JavaScript
微信小程序连接数据库与WXS的使用
微信小程序连接数据库与WXS的使用
369 0
|
19天前
|
人工智能 自然语言处理 搜索推荐
2025年11月,中国数字人平台介绍及应用场景全解析
2025年,数字人技术加速落地,凭借AI、图形学与多模态交互融合,广泛应用于金融、教育、政务等领域。
|
1月前
|
数据采集 SQL 人工智能
详解面试高频的 28 个 RAG 问题:从基础知识到架构优化全面剖析!
这篇文章我们就系统梳理 28 个高频面试问题,直接带你理解 RAG 从“原理 → 问题 → 优化 → 未来”的完整演化逻辑,确保你下一次面试不被问懵。
|
8月前
|
人工智能 程序员 API
写作即思考:工程师如何用技术文档完成逻辑的『认知复利』
技术写作:在程序员的世界里,人们常说“Talk is cheap, show me the code”,但随着生成式AI的普及,“Code is cheap, show me the prompt”正悄然改写规则。
|
前端开发 jenkins 测试技术
自动化测试介绍,为何 Apifox 是进行自动化测试的最佳工具
自动化测试利用专用软件执行测试用例,比手动测试更高效准确。Apifox是一款集API文档、调试与自动化测试于一体的工具,提供一体化解决方案,简化API变更管理。其强大的测试功能支持丰富的断言及测试场景组合,便于模拟真实业务流程。Apifox还提供详尽的测试报告与分析功能,有助于快速定位问题。此外,它能轻松集成到CI/CD流程中,并支持定时任务及多分支管理,极大提升了测试效率和团队协作。相较于其他工具,Apifox以其全面的功能和友好的界面脱颖而出。
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp微信小程序的电商平台的详细设计和实现
基于SpringBoot+Vue+uniapp微信小程序的电商平台的详细设计和实现
171 1
|
存储 算法 数据挖掘
重磅发布 | OpenSearch推出向量检索GPU图算法方案并支持GPU规格售卖
OpenSearch向量检索版推出了面向企业开发者的GPU图算法方案(CAGRA算法),支持客户直接购买GPU规格节点,是国内首家支持GPU规格的向量检索产品。
957 12
|
存储 消息中间件 缓存
独特架构打造新一代消息队列Apache Pulsar
Apache Pulsar 是一个开源的分布式消息流平台,由雅虎开发并于 2016 年开源,2018 年成为 Apache 顶级项目。Pulsar 通过独特的架构提供多租户、持久化存储和批处理等高级功能,支持高吞吐量、低延迟的消息传递。其核心组件包括 Broker、Apache BookKeeper 和 Apache ZooKeeper,分别负责消息处理、持久化存储和集群管理。
456 1
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的大学生勤工助学管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的大学生勤工助学管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
327 7
|
文字识别
【提取翻译竖排文字日文图片的软件】竖排的日语图片文字识别翻译,竖排的日语图片文字如何识别,竖排日语图片识别后转横排,竖排的日语识别比较友好的方法
这款软件专攻竖排日语图片文字识别,支持自动横排转换,能准确提取左右排版文字,并翻译成中文。用户可从百度网盘或腾讯云盘下载。功能包括图片打开、拖拽识别、截屏拾取、顺序识别、文字导出、快捷搜索及窗体操作。识别时注意保持文字等高以减少误差。附带视频教程(BV1vW4y1p7st)帮助快速上手。
2742 1