免费下载!由 O’Reilly 出版的《NGINX 完全指南》中文版已正式上线 了解详情
写点什么

Groovy 中的 Actor 模型

  • 2009-01-19
  • 本文字数:1620 字

    阅读完需:约 5 分钟

性能是所有程序开发人员无法回避的问题,性能糟糕的程序只会将客户拒之门外,让开发商的声誉受损,让投资人的金钱打水漂。然而优秀的性能表现并非能免费获得,即便在当今的多核时代,一个单线程程序也不会因部署到多核机器上而使性能自动提升。不错,在众多提升性能的手段中,使程序并行化是其中最容易想到且最有效的手段之一。然而对于大多数主流编程语言来讲,“说来容易,做起来难”这句老话在多线程编程上可谓体现得淋漓尽致。以 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 语言的开发者,他们则可以选择以下的框架:

关于这些框架的比较,可以参见这个帖子

出于对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 {<br></br> println receive()<br></br>}<br></br>启动并发送消息。

actor.start()<br></br>actor.send('Message')<br></br>扩展 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 和Erlang 内容,请浏览InfoQ 中文站 Groovy 专题 Erlang 专题

2009-01-19 21:192043
用户头像

发布了 255 篇内容, 共 52.5 次阅读, 收获喜欢 8 次。

关注

评论 1 条评论

发布
用户头像
"在收到消息时 Actor 所采取的所有动作都是并行的,在一个方法中的动作没有明确的顺序" 这一句怎么理解?
2022-08-09 10:10 · 北京
回复
没有更多了
发现更多内容

NPM 实用命令与快捷方式

SEAL安全

JavaScript npm 企业号 4 月 PK 榜

已献出膝盖!GitHub上的宝藏级SpringBoot核心宝典,讲得太清晰了

做梦都在改BUG

Java 架构 微服务 Spring Boot 框架

ThreadLocal源码分析

做梦都在改BUG

Java 源码 多线程 ThreadLocal

Tars-Cpp 协程实现分析

vivo互联网技术

协程 TARS

阿里二面:小伙子你来聊聊Redis高可用

Java全栈架构师

redis 面试 高可用 后端 架构师

七大关键技术,华为云数据库GaussD承载金融级核心系统

平平无奇爱好科技

云计算,

阿里开发实录:慢SQL拖垮数据库并引发故障

Java永远的神

数据库 sql 程序员 后端 架构师

商业堡垒机是什么意思?有免费版的商业堡垒机吗?

行云管家

网络安全 堡垒机 运维审计

企业上云,华为云桌面兼顾效率与安全

平平无奇爱好科技

企业数据的最后防线——华为云数据灾备

YG科技

云计算,

Guava的EventBus事件机制实现

Java你猿哥

Java 源码 ssm Guava EventBus

阿里云机器学习PAI发布基于HLO的全自动分布式系统 TePDist,并宣布开源!

阿里云大数据AI技术

深度学习 分布式系统 开源项目 企业号 4 月 PK 榜

【堡垒机】免费堡垒机介绍以及下载看这里!

行云管家

堡垒机 运维审计 免费 小微企业

中国浙江|浙江省级人才计划申报指南来了!

科兴未来News

双创比赛

共享电单车生产厂家如何选择

自助洗车加盟

共享电动车厂家 共享电单车生产 共享电动车厂商 本铯智能共享电动车商家

掌握动态规划,从“什么问题适合用”及“解题思路”入手

华为云开发者联盟

人工智能 AI 华为云 华为云开发者联盟 企业号 4 月 PK 榜

ES的索引结构与算法解析

京东科技开发者

搜索引擎 elasticsearch 索引结构 ES 企业号 4 月 PK 榜

阿里P8架构师珍藏版:SpringBoot入门到进阶笔记(面面俱到,太全了)

采菊东篱下

编程 微服务

java 开发 SSM 框架整合之 MyBatis 动态 SQL

Java你猿哥

Java sql mybatis SSM框架 if

华为云OBS,助力企业海量、安全、高可靠、低成本数据存储

轶天下事

云计算,

从原理聊JVM(二):从串行收集器到分区收集开创者G1

京东科技开发者

G1 JVM 垃圾回收器 java 企业号 4 月 PK 榜

如何用DataTester设计并创建可视化实验

字节跳动数据平台

AB testing实战 A/B测试 企业号 4 月 PK 榜

基于STM32设计的音乐播放器

DS小龙哥

三周年连更

AI降临,前端启用面壁计划

京东科技开发者

人工智能 AI 前端 企业号 4 月 PK 榜

Bytebase 体验官之 MySQL 「SQL 审核」

朱亚光

简直人生外挂,直接涨薪25K,跪谢这份Java性能调优实战宝典

做梦都在改BUG

Java 性能优化 JVM 性能调优

阿里p8强烈推荐这部《从零开始学架构》堪称GitHub最强!

Java你猿哥

Java 架构 ssm 架构设计

数据灾备方案,华为云为何受众多企业信赖与选择?

平平无奇爱好科技

Spring循环依赖为何使用三级缓存?

Java你猿哥

Java spring 缓存 bean spring ioc

GitHub排名第一《lntellij IDEA软件开发与应用实战手册》限时开源

Java你猿哥

Java spring ssm IDEA

Groovy中的Actor模型_Java_胡键_InfoQ精选文章