Groovy中的Actor模型
2014-02-07 11:52
211 查看
http://www.infoq.com/cn/news/2009/01/actor-in-groovy
性能是所有程序开发人员无法回避的问题,性能糟糕的程序只会将客户拒之门外,让开发商的声誉受损,让投资人的金钱打水漂。然而优秀的性能表现并非能免费获得,即便在当今的多核时代,一个单线程程序也不会因部署到多核机器上而使性能自动提升。不错,在众多提升性能的手段中,使程序并行化是其中最容易想到且最有效的手段之一。然而对于大多数主流编程语言来讲,“说来容易,做起来难”这句老话在多线程编程上可谓体现得淋漓尽致。以Java这一无所不在的语言为例,死锁、资源分配、状态共享、调试、异步调用无一例外都是在多线程编程过程中的拦路虎。这一点想必有过Java多线程编程经验的开发者都有体会。而随着并行需求的越来越高,另一门有着悠久历史的语言也重新得到了主流世界的关注,它就是Erlang。
Erlang以其对并行编程天生的支持而闻名。在其他语言看来棘手的并行编程问题,对Erlang来说则显得是轻而易举。由于无共享、基于消息等特点,使得死锁、状态共享、异步调用等困扰多线程编程的问题在Erlang中不复存在。正是因为使用它编写并行程序容易,使得这些年来国内技术社区对Erlang的关注在不断地升温。当然,任何一门成功语言的背后都离不开坚实的理论基础。Erlang也不例外。支撑其对并行编程有着良好支持的幕后功臣要归功于Actor模型。
Actor模型并非什么新鲜事物,它由Carl Hewitt于上世纪70年代早期提出,目的是为了解决分布式编程中一系列的编程问题。其特点如下(摘自这个幻灯片):
系统中的所有事物都可以扮演一个Actor
Actor之间完全独立
在收到消息时Actor所采取的所有动作都是并行的,在一个方法中的动作没有明确的顺序
Actor由标识和当前行为描述
Actor可能被分成原始(primitive)和非原始(non primitive)类别
非原始Actor有
由一个邮件地址表示的标识
当前行为由一组知识(acquaintances)(实例变量或本地状态)和定义Actor在收到消息时将采取的动作组成
消息传递是非阻塞和异步的,其机制是邮件队列(mail-queue)
所有消息发送都是并行的
幸运的是,Erlang并非是实现了Actor模型的唯一语言。在Java平台上,开发者还能够选择Scala。对于那些坚守“纯”Java语言的开发者,他们则可以选择以下的框架:
Kilim
Jetlang
Actor's Guild
ActorFoundry
关于这些框架的比较,可以参见这个帖子。
出于对Scala的Actor库的“艳羡”,Vaclav Pech在其项目GParallelizer中也实现了Actor模型。该项目是用Groovy实现的并行处理DSL,当前版本为0.4。GParallelizer提供了多种Actor类,它们的区别在于所用消息队列的类型不同。GParallelizer中Actor的主要方法有:
send,发送消息
receive,接收消息
start,启动Actor
act,该方法是protected类型的,它由Actor的线程周期调用,直到Actor上的stop被调用为止。GParallelizer提供了一种“即发即弃”的Actor:OneShotActor,它的stop方法会在首次执行act之后自动被调用。
stop,停止Actor
Actor上的生命周期方法有:
afterStart
beforeStop
afterStop
Vaclav Pech并在其博客对Actor的主要使用进行了说明。
创建一个打印它收到的所有消息的一个Actor。
启动并发送消息。
扩展Actor。
除了这些入门的例子,Vaclav Pech还列举了相对实用的两个例子:计算器和并行归并排序。关于这些例子的详情可以从其博客了解一二。
除了Actor,GParallelizer的主要组件还包括:
Asynchronizer,基于Java Executors的并行集合处理器
Parallelizer,使用JSR-166y并行数组(Parallel Arrays)来对多线程集合处理提供支持。
性能是所有程序开发人员无法回避的问题,性能糟糕的程序只会将客户拒之门外,让开发商的声誉受损,让投资人的金钱打水漂。然而优秀的性能表现并非能免费获得,即便在当今的多核时代,一个单线程程序也不会因部署到多核机器上而使性能自动提升。不错,在众多提升性能的手段中,使程序并行化是其中最容易想到且最有效的手段之一。然而对于大多数主流编程语言来讲,“说来容易,做起来难”这句老话在多线程编程上可谓体现得淋漓尽致。以Java这一无所不在的语言为例,死锁、资源分配、状态共享、调试、异步调用无一例外都是在多线程编程过程中的拦路虎。这一点想必有过Java多线程编程经验的开发者都有体会。而随着并行需求的越来越高,另一门有着悠久历史的语言也重新得到了主流世界的关注,它就是Erlang。
Erlang以其对并行编程天生的支持而闻名。在其他语言看来棘手的并行编程问题,对Erlang来说则显得是轻而易举。由于无共享、基于消息等特点,使得死锁、状态共享、异步调用等困扰多线程编程的问题在Erlang中不复存在。正是因为使用它编写并行程序容易,使得这些年来国内技术社区对Erlang的关注在不断地升温。当然,任何一门成功语言的背后都离不开坚实的理论基础。Erlang也不例外。支撑其对并行编程有着良好支持的幕后功臣要归功于Actor模型。
Actor模型并非什么新鲜事物,它由Carl Hewitt于上世纪70年代早期提出,目的是为了解决分布式编程中一系列的编程问题。其特点如下(摘自这个幻灯片):
系统中的所有事物都可以扮演一个Actor
Actor之间完全独立
在收到消息时Actor所采取的所有动作都是并行的,在一个方法中的动作没有明确的顺序
Actor由标识和当前行为描述
Actor可能被分成原始(primitive)和非原始(non primitive)类别
非原始Actor有
由一个邮件地址表示的标识
当前行为由一组知识(acquaintances)(实例变量或本地状态)和定义Actor在收到消息时将采取的动作组成
消息传递是非阻塞和异步的,其机制是邮件队列(mail-queue)
所有消息发送都是并行的
幸运的是,Erlang并非是实现了Actor模型的唯一语言。在Java平台上,开发者还能够选择Scala。对于那些坚守“纯”Java语言的开发者,他们则可以选择以下的框架:
Kilim
Jetlang
Actor's Guild
ActorFoundry
关于这些框架的比较,可以参见这个帖子。
出于对Scala的Actor库的“艳羡”,Vaclav Pech在其项目GParallelizer中也实现了Actor模型。该项目是用Groovy实现的并行处理DSL,当前版本为0.4。GParallelizer提供了多种Actor类,它们的区别在于所用消息队列的类型不同。GParallelizer中Actor的主要方法有:
send,发送消息
receive,接收消息
start,启动Actor
act,该方法是protected类型的,它由Actor的线程周期调用,直到Actor上的stop被调用为止。GParallelizer提供了一种“即发即弃”的Actor:OneShotActor,它的stop方法会在首次执行act之后自动被调用。
stop,停止Actor
Actor上的生命周期方法有:
afterStart
beforeStop
afterStop
Vaclav Pech并在其博客对Actor的主要使用进行了说明。
创建一个打印它收到的所有消息的一个Actor。
def actor = Actors.actor { println receive() }
启动并发送消息。
actor.start() actor.send('Message')
扩展Actor。
class CustomActor extends BoundedActor { @Override protected void act() { println receive() } } def actor=new CustomActor()
除了这些入门的例子,Vaclav Pech还列举了相对实用的两个例子:计算器和并行归并排序。关于这些例子的详情可以从其博客了解一二。
除了Actor,GParallelizer的主要组件还包括:
Asynchronizer,基于Java Executors的并行集合处理器
Parallelizer,使用JSR-166y并行数组(Parallel Arrays)来对多线程集合处理提供支持。
相关文章推荐
- Groovy中的Actor模型_网页设计
- Akka并发编程——第四节:Actor模型(三)
- Erlang 中的并发 -- Actor 模型
- Actor模型的本质:究竟是要解决什么问题
- Actor模型的本质
- Actor模型
- Actor模型
- Actor模型与Akka
- [置顶] C++并发编程框架Theron(1)——Actor模型介绍
- 为什么Actor模型是高并发事务的终极解决方案?
- Akka并发编程——第五节:Actor模型(四) 停止Actor
- 为什么Actor模型是高并发事务的终极解决方案?
- Actor模型
- 《通过C#学Proto.Actor模型》之PID
- Akka并发编程——2、Actor模型(二)
- Actor模型前奏
- Actor并发模型&基于共享内存线程模型
- ActorLite:一个轻量级Actor模型实现(上)
- Erlang 中的并发 -- Actor 模型
- 下一代的 Actor 模型框架 Proto Actor