2010-10-25 60 views
25

我認爲Erlang風格的併發性是核心計數指數增長的答案。你可以用其他主流語言來僞造它。但解決方案總是讓我想要。我不願放棄多範式編程(C++/D)來切換到Erlang的嚴格語法。D編程語言中的Erlang風格併發性

什麼是Erlang的風格併發:

從語言的作者(What is Erlang's concurrency model actually ?)中的一個:

  • 輕量級併發。
    創建線程便宜,維護瘋狂的數字便宜。
  • 異步通信。
    線程只通過消息進行通信。
  • 錯誤處理。
  • 過程隔離。

或從知情博客(What is Erlang-Style Concurrency?):

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

我認爲D's message passing可以完成大部分這些功能。我想知道的是「>> 10,000個併發進程(線程)」和「快速進程創建/破壞」。 D如何處理這些要求?

D如何處理這些要求?

我認爲,要正確支持它們,您必須使用green threads。 D的消息傳遞功能可以與綠色線程庫一起使用嗎?

+1

如果你還沒有,看看Go。 – nmichaels 2010-10-30 03:14:59

+0

並在鏽。 Rust具有消息傳遞,模式匹配和綠色線程,這允許大量的併發任務/進程。它也有一些類型的頻道(類似於Go)。 – 2014-08-06 14:50:28

回答

19

缺省情況下,存儲在D中是線程本地的,所以除非特別標記爲shared,否則線程之間不會共享任何內容。如果將變量標記爲shared,則可以使用傳統的互斥鎖和條件以及同步對象等來處理併發性。但是,線程間通信的首選方式是使用std.concurrency中的消息傳遞工具,並讓所有數據保持線程本地,必要時僅使用shared。使用std.concurrency在線程之間傳遞的所有對象都必須通過值傳遞或者是不可變的,因此不會發生共享,並且它完全是線程安全的。然而,獲取一個不是數組的不可變引用類型(idup通常使數組很容易)可能會有點痛苦,因此傳遞除了值類型或數組以外的任何東西可能有點煩人(儘管希望這種情況很快得到改善,因爲與const和不可變的編譯器和標準庫bug相關的問題得到解決,並且更多的代碼被改爲const正確的)。雖然在D中傳遞消息肯定會產生比C++或Java等語言更清潔,更安全的代碼,但它建立在普通的C線程之上(例如Linux使用pthreads),它是, ,所以它沒有Erlang那種輕量級的線程,所以處理多線程不會像Erlang那樣高效。

當然,我沒有看到爲什麼用D編寫更高效的線程系統的任何理由,在這一點上,您可能能夠獲得與Erlang類似的線程效率,並且它可能推測使用API與std.concurrency類似,但所有D的標準線程化內容都建立在普通的C線程之上,所以你必須自己完成所有這些工作,並且取決於你如何實現它,線程本地/ shared東西由編譯器和druntime處理,可能很難讓類型系統強制使用「綠色」線程執行一切線程化處理。恐怕我對「shared」的實施方式以及「綠色」線程的工作原理知之甚少。無論如何,D的消息傳遞系統肯定會導致處理線程比C++甚至Java更令人愉快,但它的設計並不像Erlang那樣精簡。 D是一種通用的系統語言,而不是專門設計用於使用所有內容的任何語言的語言,因此儘可能有效地使用它們。 D的大部分標準設施都建立在C之上,因此它的許多效率特性與C類似。

+7

Erlang線程實際上只是一個堆棧幀和一些上下文 - 可能是光纖是一個更合適的術語。 Erlang虛擬機安排一些操作系統線程來服務1000個用戶模式的光纖。這比任何其他方案都整齊,規模更好,但是卻沒有用到D的共享與線程本地存儲的概念。這不是D的錯,因爲至少x86處理器不提供硬件執行來隔離一個光纖數據。例如,在真正的操作系統線程的情況下,x86 GS寄存器保持在64位機器中隔離每個線程的數據。 – srking 2010-11-03 05:15:55

+5

此外,如果您不擔心線程本地存儲問題,D確實有一個很好的光纖庫。 D光纖之間的上下文切換時間比D線之間快上6倍。 – srking 2010-11-03 05:41:04

+0

D纖維被列入標準libruary。但他們只實施非預先多任務處理。 – uhbif19 2013-05-12 19:14:47

4

從我對D所瞭解的很少:它的消息傳遞基礎設施建立在它的穿線設施之上。如果核心線程庫是操作系統線程的包裝,那麼D中的併發幾乎不可能達到Erlang的大小(>> 10000)。此外,D不強制對象的不變性,所以很容易搞砸了。所以,Erlang是繁重併發的最佳選擇。也許你可以在Erlang編寫併發性的東西,在D中編寫其餘的項目。儘管如此,可以在C語言(C++,D等)中使用高效的綠色線程 - 看看ProtothreadsZeroMQ。您可以使用這些實現非常高效的消息框架,並通過C墊片或directly from D來調用它們。

+6

你可以*用*不可變修飾符在D中創建一個不可變的對象(深層)。這不是默認設置。 – kennytm 2010-10-25 12:03:24

+1

@KennyTM是的,這就是爲什麼我說「D不*強制*對物體不變*」 – 2010-10-25 12:24:20

+5

@Vijay:是的,是嗎?你不能通過D的消息傳遞接口發送可變數據。如果您發送的不是「不可變的」對象,編譯器會阻止您。 – kennytm 2010-10-25 12:55:26

7

此功能經常與異步I/O結合使用,以便與外部進行有效通信數據來源也是如此。 vibe.d框架似乎同時提供了幾個OS上的多線程線程模型和異步I/O庫(除了大量的Web應用程序庫和項目管理工具)。

作爲一個無關的方面說明,它非常酷,D既低級別,你可以在其中編寫這個框架,並且足夠高級以成爲一種引人注目的語言來編寫Web應用程序框架。其他具有相似框架的流行語言(node.js,Ruby的EventMachine,Python和Go中的協程)無法與低級別系統編碼的D競爭。其他具有類似系統編程工具(C,C++)的流行語言無法在高級應用程序編碼上競爭。

我是新來的D,但我得說,我喜歡我所看到的。