2008-08-22 33 views
19

其他編程語言提供了哪些庫來提供Erlang風格的併發模型(進程,郵箱,模式匹配接收等)?其他語言的Erlang風格的併發性

注:我特別感興趣的是與Erlang類似的東西,而不僅僅是任何線程庫或排隊庫。

+0

這裏的主要困難是,儘管你可以用其他語言傳遞消息,但是模仿Erlang使用大量進程是非常困難的。 Erlang中的產卵過程類似於在Java或Python中實例化對象 - 您不需要考慮。如果您在操作系統級別執行此操作,您將很快耗盡資源,這意味着它不僅僅是消息傳遞,而且還必須將其合併到架構中。在這方面,Erlang的虛擬機有點難以遵循。當然,並非每個問題都需要數百萬個併發進程。 – zxq9 2014-10-01 10:52:56

回答

7

消息傳遞接口(MPI)(http://www-unix.mcs.anl.gov/mpi/)是一個用於並行編程的高度可擴展和強大的庫,面向C的原始版本,但現在可用於幾種版本http://en.wikipedia.org/wiki/Message_Passing_Interface#Implementations。雖然這個庫沒有引入新的語法,但它提供了一種通信協議來協調可並行化的例程之間的數據共享。

傳統上,它被用於大型集羣計算而不是單一系統的併發,儘管多核系統當然可以利用這個庫。

並行編程問題的另一個有趣的解決方案是OpenMP,它試圖在各種平臺上提供可移植擴展,以向編譯器提供關於哪些代碼段容易並行化的提示。

例如(http://en.wikipedia.org/wiki/OpenMP#Work-sharing_constructs):

#define N 100000 
int main(int argc, char *argv[]) 
{ 
    int i, a[N]; 
    #pragma omp parallel for 
    for (i=0;i<N;i++) 
    a[i]= 2*i; 
    return 0; 
} 

有優點和缺點這兩個,當然,但前者已被證明是在學術界和其他重型科學計算的應用非常成功。因人而異。

6

Microsoft的Concurrency and Coordination Runtime for .NET。

的CCR是適合於該 部件分離成片,可以 僅通過消息交互的應用程序 模型。 這個模型中的組件需要手段 消息之間的協調,處理 複雜的故障情況,和 有效地處理異步 編程。

7

斯卡拉支持演員。但我不會打算scala故意類似於Erlang。

儘管如此scala絕對值得一看!

6

另外kilim是一個java庫,它將erlang風格的消息傳遞/參與者引入Java語言。

5

Mike Rettig創建了一個名爲Retlang的.NET庫和一個名爲Jetlang的Java端口,它受Erlang併發模型的啓發。

14

Ulf Wiger有一個偉大的職位最近關於這個主題 - 在這裏是因爲需要纔可以調用的東西「二郎風格併發」,他定義的屬性:

  • 快速進程創建/銷燬
  • 能夠支持>> 10 000個併發進程,特性基本不變。
  • 快速異步消息傳遞。
  • 複製消息傳遞語義(無共享併發)。
  • 過程監控。
  • 選擇性訊息接收。

上面的第2個數字最難支持最初並未設計爲併發的VM和語言實現。這並不是要在其他語言中推敲Erlang-ish併發實現,但是很多Erlang的價值來自於能夠創建進程的百萬,如果進程抽象與OS具有1-1關係,這非常困難級別的線程或進程。在上面的鏈接中,Ulf有很多這方面的內容。

3

如果您在使用Ruby,看看Revactor的:http://revactor.org/][1]

Revactor的是Ruby 1.9的Actor模型的實現建立在啓高性能事件庫的頂部。 Revactor主要用於編寫類似Erlang的網絡服務和工具。

看看這個代碼示例:

myactor = Actor.spawn do 
    Actor.receive do |filter| 
     filter.when(:dog) { puts "I got a dog!" } 
    end 
    end 

Revactor的只能運行在Ruby 1.9的。我相信圖書館的作者已經停止了維護,但他們網站上的文檔非常好。

您可能還想看看Reia:一種構建在Erlang虛擬機之上的ruby式腳本語言。 Reia是Revactor創造者的新項目:Tony Arcieri。

2

JoCaml OCaml的延伸與加盟結石併發和分佈式編程。

1

Akka(http://akka.io)受Erlangs OTP嚴重影響。它建立在scala的角色之上,並且非常適合JVM上的併發。