Groovy 学习手册(7)
学习 手册 Groovy
2023-09-27 14:21:05 时间
10. Groovy GPars
GPars 一开始在 Groovy 中作为一个单独的项目,同时带来了很多并发的机制。它包含了很多并行的map/redue
,Actors
,以及其他很多并发的模块。
1. Parallel Map-Reduce
在下面的例子中,我们定义了一个包含毕业年份和平均分数的Student
类。
class Student {
int graduationYear;
double gpa;
}
同时定义个包含Student
的 List,这时你就可以使用 GPars 类库对 List 执行并行的 map-reduce 操作。
GParsPool.withPool {
// a map-reduce functional style (students is a Collection)
def bestGpa = students.parallel
.filter{ s -> s.graduationYear == Student.THIS_YEAR }
.map{ s -> s.gpa }
.max()
}
静态方法GParsPool.withPool
接收一个闭包以及增加集合的方法(使用 Groovy 的 Category 机制)。parallel
实际上从给定的集合中创建了一个ParallelArray
对象,在使用时包装了一个包装类。
Tip
详情请参考Map-Reduce
2. Actor
Actor 设计模式在开发并发软件时非常有用。在此模式中,每一个 Actor 执行自己的线程和操作只属于自己的数据。这些数据不能被其他的线程所操作。消息在 Actor 中被传递,从而改变数据。你也可以创建无状态的 Actor。
当在某一时间数据只能被一个线程所改变时,我们就称之为是线程安全的。
import groovyx.gpars.actor.Actor
import groovyx.gpars.actor.DefaultActor
class Dragon extends DefaultActor {
int age
void afterStart() {
age = new Random().nextInt(1000) + 1
}
void act() {
loop {
react { int num ->
if (num > age)
reply 'too old'
else if (num < age)
reply 'too young'
else {
reply 'you guessed right!'
terminate()
}
}
}
}
}
// Guesses the age of the Dragon
class Guesser extends DefaultActor {
String name
Actor server
int myNum
void act() {
loop {
myNum = new Random().nextInt(1000) + 1
server.send myNum
react {
switch (it) {
case 'too old': println "$name: $myNum was too old"; break
case 'too young': println "$name: $myNum was too young"; break
default: println "$name: I won $myNum"; terminate(); break
}
}
}
}
}
def master = new Dragon().start()
def player = new Guesser(name: 'Guesser', server: master).start()
//this forces main thread to live until both actors stop
[master, player]*.join()
在这里,Dragon
类一开始随机生成在1到1000的年龄的整数。它对一个给定的数字作出反应,如果数字太大,太小,或相同的年龄。Guesser
类不停循环,产生一个随机数并发送到Dragon
类(也就是Server)。Guesser
类从Dragon
类得到反馈程序终止时,则猜出正确的年龄了。
相关文章
- Intel汇编语言程序设计学习-第四章 数据传送、寻址和算术运算-上
- Java学习手册
- Python学习手册
- 【学习笔记16】JavaScript函数封装习题
- 【学习笔记27】JavaScript字符串方法的练习
- go基础入门快速学习手册
- javascript快速学习手册
- PostgreSQL学习手册(目录)
- Caffe学习系列(16):caffemodel可视化
- Caffe学习系列(1):安装配置ubuntu14.04+cuda7.5+caffe+cudnn
- Java反射学习总结五(Annotation(注解)-基础篇)
- Redis学习手册(事务)
- Redis学习手册(Set数据类型)
- 大数据学习——采集目录到HDFS
- 大数据学习——点击流日志每天都10T,在业务应用服务器上,需要准实时上传至(Hadoop HDFS)上
- SQLite的文件锁、并发与pager---(SQLite学习手册(锁和并发控制))
- 《深度强化学习——边做边学》第二章 在走迷宫任务中随机探索 (修改后的代码)
- Unity框架学习_编辑器自动生成UI代码_减少重复工作量,高效开发
- 知识图谱入门学习笔记(二)-知识表示
- 【TDA2x学习】2021-8-3 一些疑问
- Qt学习之QListWidget删除Item
- Java EE学习记录(一)