Groovy & Java 的并发与并行框架

介绍

当今的主流计算世界正在迅速变化。如果您打开机箱并查看计算机内部,您很可能会看到一个双核处理器,或者如果您拥有高端计算机,则可能看到一个四核处理器。我们现在都在多处理器系统上运行我们的软件。

为什么人们仍然创建单线程代码?

我们今天和明天编写的代码可能永远不会在单处理器系统上运行:并行硬件已成为标准。但软件并非如此,至少目前还没有。人们仍然创建单线程代码,即使它无法利用当前和未来硬件的全部功能。


我们今天编写的代码可能永远不会在单处理器系统上运行!

一些开发人员使用低级并发原语,例如线程,以及锁或同步块进行实验。然而,很明显,应用程序级别使用的共享内存多线程方法带来的麻烦多于解决的麻烦。低级并发处理通常很难正确处理,而且也不太有趣。

随着硬件的这种根本性变化,软件也必然会发生巨大的变化。更高级别的并发和并行概念,例如map/reducefork/joinactordataflow,为不同类型的领域提供了自然的抽象,同时利用了多核硬件。

divider

认识 GPars

认识 GPars,这是一个针对 JavaGroovy 的开源并发和并行库,它为您提供了一些高级抽象,以便在 Groovy 中编写并发和并行代码(map/reduce、fork/join、异步闭包、actor、agent、数据流并发等概念),这可以使您的 JavaGroovy 代码轻松实现并发和/或并行。

使用 GPars,您的 Java 和/或 Groovy 代码可以轻松利用目标系统上所有可用的处理器。您可以同时运行多个计算,并行请求网络资源,安全地解决分层分治问题,执行函数式风格的 map/reduce 或数据并行集合处理,或者围绕 actor 或数据流模型构建您的应用程序。

Apache

GPars 项目是在 Apache 2 许可证 下开源的。

如果您正在 Groovy 中进行商业、开源、教育或任何其他类型的软件项目,请下载二进制文件或从 Maven 存储库中集成它们并开始使用。编写高度并发和/或并行 JavaGroovy 代码的大门敞开着。享受!


您的系统是否已经安装了 Groovy 1.8 或更高版本?如果是,GPars 也包含在内,因此无需再次下载。;-)

如何?

GPars 框架为 Java 开发人员提供了直观且安全的处理 Java 或 Groovy 任务的方法。利用 Groovy 编程语言 的巨大灵活性,并以成熟的 Java 技术为基础,我们的目标是使多核硬件的并发编程变得直观、健壮且令人愉快。

GPars 是一个多范式并发框架,提供多个相互协作的高级并发抽象,例如数据流运算符承诺CSPActor异步函数Agent并行集合

为什么人们喜欢 GPars

听听那些已经使用 GPars 的人怎么说,请查看 用户声音

内置于 Java 中的传统基于线程的并发模型与人们对并行的自然感觉并不相符。虽然这在软件并行度较低且并发与顺序代码相比仅提供有限优势时并非问题。

如今,随着单个主流芯片上的内核数量几乎每年翻倍,顺序代码迅速失去优势,在性能和硬件利用率方面无法与并发代码竞争。

不可避免地,为了使并发编程有效,人们在脑海中创建的并发系统交互的心理模型必须比芯片上的线路更尊重人脑的性质。幸运的是,这种抽象已经存在了几十年,在大学、电话交换机、超级计算行业以及其他一些固有的并发领域使用。GPars 当前面临的挑战是将这些抽象提升到主流软件开发人员手中,帮助我们解决日常的实际问题。


用户指南

有关 GPars 抽象的广泛介绍,请参阅我们的 最新用户指南 或任何其他旧的 用户指南。您可能还喜欢一些 演示 来体验这里为您提供的内容。

该框架提供了简单的基于 JavaGroovy 的 API,用于声明代码的哪些部分应该并行执行。集合可以并发处理其元素,闭包可以转换为可组合的异步函数并在后台为您运行,可变数据可以受 agent 或软件事务内存的保护。

对于一个或多个结果并发计算但需要在它们可用时立即处理的常见场景,GPars 使正确地使用 数据流 对其进行建模变得轻而易举。数据流变量和通道为您提供了一个方便的单赋值多读取数据元素抽象,而数据流运算符使您能够构建高效的并发数据处理网络。

数据流示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
final SyncDataflowQueue channel = new SyncDataflowQueue()

def producer = task {
    (1..30).each {
        channel << it  //writing to a channel
        println "Just sent $it"
    }
}

def consumer = task {
    while (true) {
        sleep 500  //simulating a slow consumer
        final Object msg = channel.val
        println "Received $msg"
    }
}

producer.join()

作为组织并发活动的一种方法,Actor 的概念最近重新流行起来(这要归功于 Scala、Erlang 和其他编程语言)。

GParsJavaGroovy 开发人员实现了这一概念。使用 actor 支持,您可以快速创建几个独立的 Actor,这些 actor 会消耗传递给它们的消息,并通过向其他 actor 发送消息与它们通信。然后,通过将这些 actor 组合成一个通信网络来构建您的解决方案。

divider

开始吧!

以下是 GPars 中可用概念的概述

核心关注领域


项目主要优先事项

  • 良好且简洁的设计

  • 优雅的 JavaGroovy API

  • 通过元编程实现灵活性

  • 随着 CPU 内核数量的增加而扩展的应用程序级解决方案


快速入门

如果您想立即开始尝试使用 GPars,请使用这些快速入门技巧快速入门。

他们对 GPars 的评价

查看 用户声音,听听那些走在您前面的人的意见。


许可证

GPars 在开源 Apache 2 许可证 下分发。使用 GPars 即表示您完全接受许可证中规定的条款。有关完整详细信息,请参阅 Apache 2 许可证 文档或 许可证