Groovy & Java 的並行與平行框架

簡介

現今主流運算的世界正快速變化。如果您打開電腦機殼並查看內部,您很可能會看到一個雙核心處理器,或者如果您擁有一台高階電腦,則會看到一個四核心處理器。我們現在都在多處理器系統上執行軟體。

為什麼人們仍然創建單執行緒程式碼?

我們今天和明天編寫的程式碼可能永遠不會在單處理器系統上執行:平行硬體已成為標準。然而,軟體的情況並非如此,至少目前還不是。人們仍然創建單執行緒程式碼,即使它無法充分利用當前和未來硬體的全部功能。


我們今天編寫的程式碼可能永遠不會在單處理器系統上執行!

一些開發人員會嘗試使用低階並行基本元件,例如執行緒、鎖定或同步區塊。然而,顯然應用程式層級使用的共享記憶體多執行緒方法弊大於利。低階並行處理通常很難正確實現,而且也不有趣。

隨著硬體的這種巨大變化,軟體也必然需要發生巨大變化。更高階的並行和並行概念,例如map/reducefork/joinactor資料流,為不同類型的問題領域提供了自然的抽象,同時利用了多核心硬體。

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 是一個多範式並行框架,提供多種相互協作的高階並行抽象概念,例如資料流運算子PromiseCSPActor非同步函數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 授權文件或授權