2010-03-26 33 views
20

我讀了一本關於Matz(Ruby的發明者)的書(七個周內的七種語言by Bruce A. Tate)的一章,說'我會刪除線程並添加演員或其他一些更高級的併發功能'。取代線程模型的Actor模型?

  • 爲什麼和如何一個actor模型可以是一個高級的併發模型來替換線程?
  • 「高級併發模型」還有哪些其他模型?

回答

15

這與其說是演員型號將取代線程;在CPU的級別上,進程仍然有多個線程,這些線程在處理器內核上進行調度和運行。參與者的想法是用它的支持者認爲的模型替代這種潛在的複雜性,使得程序員更容易編寫可靠的代碼。

參與者的想法是有單獨的消息傳遞通信的單獨控制線程(Erlang說法中的過程)。更傳統的編程模型將是共享內存,並使用互斥體協調線程之間的通信。這仍然發生在actor模型的表面下,但細節被抽象出來,並且程序員被賦予基於消息傳遞的可靠原語。

重要的一點是演員不必將1-1映射到線程 - 在Erlang的情況下,他們肯定不會 - 每個內核線程通常會有很多Erlang進程。所以必須有一個調度程序來將參與者分配給線程,而這個細節也是從應用程序員中抽象出來的。

如果你對演員模特感興趣,你可能想看看它在ErlangScala的工作方式。

如果您對其他類型的新併發熱度感興趣,您可能需要查看software transactional memory,這是一種可以在clojure和haskell中找到的不同方法。

值得一提的是,許多更積極的創建高級併發模型的嘗試似乎都發生在函數式語言中。可能是由於這種信念(我自己喝了一些這種kool-aid),這種不變性使併發性變得更容易。

+1

我會進一步說,不變性增加了系統的魯棒性。併發性是軟件複雜性的一個方面,其中穩健性的差異非常明顯。即使不需要滿足併發性問題,非常複雜的系統也可以從使用不變性中受益。 – 2010-12-11 00:42:36

+0

另外,請記住,actor模型也可以應用在網絡中,以開發請求處理的異步模型。事實上,鑑於多核將成爲規則,這種抽象在OS API級別上可能甚至是有趣的(至少對我而言)。 – Coyote21 2011-06-04 22:05:56

2

我提出這個問題,我的最愛,我等待的答案,但由於仍然沒有,這裏是我的..

爲什麼,以及如何演員模型可以是 先進的併發模型 替換線程?

參與者可以擺脫可變的共享狀態,這很難正確編碼。 (我的理解是)actors基本上可以認爲是擁有自己的線程的對象。您可以在actor之間的線程中排隊和使用的actor之間發送消息。所以,演員的任何狀態都是封裝的,不會被共享。所以很容易編寫正確的代碼。

也看到http://www.slideshare.net/jboner/state-youre-doing-it-wrong-javaone-2009

什麼其他車型的 '先進 併發模型'?

看到http://www.slideshare.net/jboner/state-youre-doing-it-wrong-javaone-2009

2

請參閱數據流編程。這是一種方法,它是通常面向對象設計的頂層。有的話:

  • 有一個場景,其中組件駐留;
  • 組件具有端口生產者(輸出,這產生消息)和消費者(輸入方法,該方法的消息);
  • 消息組件之間預先定義:一個組件的生產者端口綁定到另一個的消費者。

編程正在發生3層:

  • 寫入數據流系統(語言,框架/服務器,組件API),
  • 寫入組件(系統,鹼性和麪向領域的那些),
  • 創建數據流程序:將組件放入場景中,並定義它們之間的消息。

維基百科的文章是很好的起點,以瞭解業務:http://en.wikipedia.org/wiki/Flow-based_programming 另請參見 「角色模型」, 「數據流編程」 等

+0

我不確定我會通過OOP調用Dataflow一層,更多的是用一些概念交叉來替代OOP。根據Smalltalk的說法,你可以說OOP是一種面向消息的語言,這就是Dataflow的意思。 – 2010-12-11 00:40:35

+0

數據流系統的實現需要OOP(或至少是推薦的自然方式),具體取決於DF架構。我編寫了一個DF系統,其中調度程序和組件是用C++編寫的,連接和參數是使用propiatery腳本語言定義的,該語言編譯爲C++代碼,最終結果是a.out/ELF可執行文件。所以,底層架構是OOP,DF系統就是基於它的。 (類:消息,端口,消費者,生產者,組件(抽象)等等,當然還有很多組件類)。 – ern0 2010-12-11 09:37:53