主题

GPars 远程调用

以下是 Rafal SlawikGoogle Summer of Code,2014 中实现的 GPars 远程调用 的快速概述

该实现将成为 GPars 1.3-SNAPSHOT 的一部分,并 可立即使用

在幕后,Netty 库和标准序列化机制被用作传输层。

基本上,您可以使用 Dataflows 以及任何数据类型,将自定义消息发送到 Actors,以将自定义状态存储在 Agents 中,只要这些对象是可序列化的。

支持远程调用的 Dataflow 结构:DataflowVariableDataflowBroadcastDataflowQueue

远程实现要求

使用我们的远程调用实现通常需要

  • 在主机 A 上:创建一个上下文,并以某个名称发布一个结构(变量、队列、actor 等)

  • 在主机 B 上:创建一个上下文,并以该名称检索一个结构

上下文 概念对测试很有用。可以在同一个 VM 中拥有一个原始实例和一个远程代理,或者用于其他目的,例如每个线程都有自己的远程代理。重要的是,远程代理具有相同的接口,因此可以使用它,就好像它是一个普通的实例一样。让我们看一个使用 DataflowVariables 远程调用的示例

  • 在主机 A 上:

创建上下文,启动服务器,创建实例并注册它
1
2
3
4
def remoteDataflows = RemoteDataflows.create() // creates context
remoteDataflows.startServer HOST PORT // starts server that waits for requests at HOST:PORT
def variable = new DataflowVariable() // creates variable instance
remoteDataflows.publish variable "my-first-variable" // registers it within the context under given name
  • 在主机 B 上

检索一个给定名称的变量的 promise
1
2
3
def remoteDataflows = RemoteDataflows.create() // creates context
def remoteVariablePromise = remoteDataflows.getVariable HOST, PORT, "my-first-variable" // retrieves promise of variable with given name
def remoteVariable = remoteVariablePromise.get() // extracts remote proxy from promise
您可以在我们的样本包中找到更多示例
1
groovyx.gpars.samples.remote.dataflow.*

一个 Ping-Pong 示例

现在,让我们看看 Actors 的远程调用,并考虑一个 Ping-Pong 示例,例如 groovyx.gpars.samples.remote.actor.pingpong。让我们从创建一个 actor 开始,该 actor 对每条消息都以 PONG 响应。这样的 actor 可以是这样的

Actor 设置
1
def pongActor = Actors.actor { loop { react { println it reply "PONG" } } }

它在循环中等待消息,当消息到达时,它会打印它并以 PONG 响应。为了能够从远程主机访问此 actor,它必须发布

创建上下文,启动服务器以在 HOST:PORT 上接收请求,在上下文中的 pong 名称下注册 pongActor
1
2
3
def remoteActors = RemoteActors.create() // creates context
remoteActors.startServer HOST, PORT // starts server that waits for requests at HOST:PORT
remoteActors.publish pongActor, "pong" // registers pongActor within context under name "pong"

剩下要做的就是在远程主机上检索到该 actor 的代理对象。可以按如下方式完成

Actor 设置
1
2
3
4
5
6
7
8
def remoteActors = RemoteActors.create() // creates context
def pingActor = Actors.actor {
        def remotePongActor = remoteActors.get HOST, PORT, "pong" get() // gets remote proxy to actor name "pong" at HOST:PORT
        remotePongActor << "PING" // sends message to it
        react {
            println it // prints reply from remote actor
        }
}

扩展示例可以在 groovyx.gpars.samples.remote.actor.pingpong 中找到。

Actors 远程调用的更多示例可在 groovyx.gpars.samples.remote.actor.* 中找到。Agents 远程调用的示例可在 groovyx.gpars.samples.remote.agent. 中找到。

将来,我们可以引入主机之间连接的多路复用(当前每次 get 操作都会打开一个新连接)和某种形式的发现机制(以避免使用显式的 HOST:PORT)。


文章

GPars 1.1.0 的 GA 版本刚刚发布,您可以立即获取。它带来了 dataflow 逻辑的逐步改进,以及其他一些领域。一些亮点

  • 添加了 LazyDataflowVariable 以允许延迟异步值

  • Select 的超时

  • 通过 Select 类添加了一个基于 PromiseAPI 用于值选择

  • 启用侦听 DataflowVariables 上的绑定错误

  • 影响 PromiseDataflowReadChannelAPI 小幅改进

  • 防止从命令内部调用 agent 的阻塞方法

  • 更新到最新的 Multiverse 0.7.0 GA 版本

  • 迁移到 Groovy 2.0

  • 在适当的地方使用了 @CompileStatic

  • 一些错误修复

尝试 GPars 1.1.0 玩得开心!


GPars 1.1.0 的第一个候选版本已发布。最终的 1.1.0 GA 预计将在几天内发布。1.1.0 版本是对 1.0.0 的逐步改进,主要在 Dataflow 领域进行了添加。从 1.1 开始,GPars 需要 Groovy 2.0 或更高版本。查看最值得注意的新功能

数据流

  • 添加了 LazyDataflowVariable 以允许延迟异步值

  • Select 的超时

  • 通过 Select 类添加了一个基于 PromiseAPI 用于值选择

  • 启用侦听 DataflowVariables 上的绑定错误

  • 影响 PromiseDataflowReadChannelAPI 小幅改进

代理

  • 防止从命令内部调用 agent 的阻塞方法

软件事务内存

  • 更新到最新的 0.7.0 GA 版本的 Multiverse

其他

  • 迁移到 Groovy 2.0

  • 在适当的地方使用了 @CompileStatic

获取 GPars 1.1.0,试用一下,并请报告所有问题,以便我们在 GA 之前修复它们。


GPars 1.0 已发布,Vaclav Pech 于 2012 年 12 月 19 日发布

我很高兴地宣布,经过四年的开发,GPars,这个 Groovy 并发库,终于达到了 1.0 版本。现在,您可以获取或下载最新的 GPars 1.0.0,并将其用于您的项目。此外,即将发布的 Groovy 版本将捆绑 GPars 1.0

与之前的版本相比,1.0 带来了几个性能改进,大量的 API 更新,完善的文档和许多功能改进,主要是在 dataflow 领域。请查看我们用户指南的 新增功能 部分以了解详细信息。

我想借此机会感谢所有 Groovy 人员,他们一直在以各种方式为 GPars 的成功做出贡献。能成为这样一种乐于助人和鼓励的社区的一员,我感到非常荣幸。特别是,我要感谢我的同事 GPars 提交者,他们是 Paul KingDierk KoenigAlex TkatchmanRussel Winder,他们一直在推动项目前进,没有他们,我们很难走到这一步。我也非常感谢 Guillaume Laforge,即 Groovy 的最高指挥官,给予我们的支持。感谢你们,先生们!

Groovy 并发时代来临!
  • Vaclav


1.0 的第一个候选版本已发布,Vaclav Pech 于 2012 年 12 月 11 日发布

我们快到了。1.0 版本即将发布。为了确保 1.0 符合您的质量预期,我们首先准备了一个候选版本来测试水域。

要试用 GPars,请在您常用的地方 下载获取 它,查看发行说明,并告诉我们是否有什么遗漏。

  • Vaclav


Beta 3 发布,Vaclav Pech 于 2012 年 9 月 10 日发布

GPars-1.0-beta-3 已发布,供您试用。

除了通常的功能和修复之外,包括并行集合上某些操作的加速或 dataflow 运算符的生命周期事件之外,与 beta-2 相比,还有一个重大变化值得明确指出

GPars 不再依赖于 extra166y 工件

Doug Lea 的并行数组库已集成到 GPars 中。jsr166yFork/Join)jar 仍然保留在依赖项列表中,直到我们将 GPars 迁移到 jdk7,但 GPars 不再依赖于 extra166y 工件。

获取 GPars-1.0-beta-3,并享受新版本的乐趣。


GPars 1.0 beta-1 准备试用,Vaclav Pech 于 2011 年 12 月 30 日发布

我们朝着 1.0 版本发布迈出的第一步已经实现。beta-1 版本现已发布,供您 获取下载。玩得开心,如果您觉得有什么需要我们注意,请告诉我们。

  • GPars 团队


并行生命游戏,Vaclav Pech 于 2011 年 9 月 1 日发布

我想把您引导到我最近的博客文章,详细介绍了 Dataflow 运算符的使用。它使用流行的生命游戏编码练习来说明 dataflow 概念的原理。请在我的个人博客查看。


GPars 今天满 0.12 岁,Vaclav Pech 于 2011 年 6 月 2 日发布

我们向所有并行灵魂宣布一个好消息 - GPars 0.12 刚刚 上架。新版本带来了许多大大小小的改进,其中最值得注意的是

  • 可组合的异步函数

  • Doug Lea 的超级酷的 Fork/Join 框架(又名 jsr-166y)的最新版本

  • 主动对象

  • 使用 Multiverse软件事务内存 支持的初始存根

查看完整的发行说明以了解更多详细信息。

要快速了解 GPars,请查看我们更新的 用户指南,该指南现在也以 pdf 格式提供。

  • 您的 GPars 团队


JVM 并发和 ActorsGParsVaclav Pech 于 2011 年 4 月 26 日发布。

Dr.Dobb’s 刚刚发布了我在 GPars 中关于 actors 的概述文章。您可以在 Drdobbs.com/High-performance Computing 查看。

  • Vaclav