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

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

开发者学堂课程【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的使用
337 0
|
Windows
Windows下CMD中文乱码问题解决方法,设置代码页65001后仍然乱码
原文地址: http://blog.csdn.net/u011250882/article/details/48136883 在中文Windows系统中,如果一个文本文件是UTF-8编码的,那么在CMD.exe命令行窗口(所谓的DOS窗口)中不能正确显示文件中的内容。在默认情况下,命令行窗口中使用的代码页是中文或者美国的,即编码是中文字符集或者西文字符集。  如果想正确显示UTF-8
13460 0
|
7月前
|
人工智能 程序员 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微信小程序的电商平台的详细设计和实现
155 1
|
搜索推荐
8个邮件营销平台分析及对比
本文对比了8个热门邮件营销平台:Aoksend适合初创企业,Constant Contact用户友好,Sendinblue提供多元营销服务,GetResponse功能全面,蜂邮EDM适合大规模活动,MailerLite价格实惠,Campaign Monitor专业定制,ActiveCampaign侧重营销自动化。选择时应考虑自身需求和预算。
|
存储 弹性计算 固态存储
阿里云服务器按量付费是什么?划算吗?
阿里云ECS按量付费模式,先使用后付费,按小时结算,适合临时扩展、测试、电商抢购等短期应用。开通需账户余额不低于100元。实例、镜像、云盘、带宽等支持按量计费,价格根据配置和地区而异。可随时转为包年包月。
2139 1
|
机器学习/深度学习 并行计算 Java
谈谈分布式训练框架DeepSpeed与Megatron
【11月更文挑战第3天】随着深度学习技术的不断发展,大规模模型的训练需求日益增长。为了应对这种需求,分布式训练框架应运而生,其中DeepSpeed和Megatron是两个备受瞩目的框架。本文将深入探讨这两个框架的背景、业务场景、优缺点、主要功能及底层实现逻辑,并提供一个基于Java语言的简单demo例子,帮助读者更好地理解这些技术。
1051 2
|
机器学习/深度学习 自然语言处理 算法
[大语言模型-工程实践] 手把手教你-基于BERT模型提取商品标题关键词及优化改进
[大语言模型-工程实践] 手把手教你-基于BERT模型提取商品标题关键词及优化改进
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的大学生勤工助学管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的大学生勤工助学管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
297 7