電腦科學中,演員模型(英語:Actor model)是一種並行運算上的模型。「演員」是一種程式上的抽象概念,被視為並行運算的基本單元:當一個演員接收到一則訊息,它可以做出一些決策、建立更多的演員、傳送更多的訊息、決定要如何回答接下來的訊息。演員可以修改它們自己的私有狀態,但是只能通過消息間接的相互影響(避免了基於鎖的同步)。

演員模型在1973年於Carl Hewitt英語Carl Hewitt、Peter Bishop及Richard Steiger的論文中提出[1]。它已經被用作並發計算理論理解英語Actor model theory框架和並發系統實際實現英語Actor model implementation基礎。演員模型和其他類似工作的關係討論可見於演員模型和進程演算英語actor model and process calculi

基本概念 編輯

演員模型推崇的哲學是「一切皆是演員」,這與面向對象編程的「一切皆是對象」類似。

演員是一個運算實體,響應接收到的消息,相互間是並發的:

  • 發送有限數量的消息給其他演員;
  • 創建有限數量的新演員;
  • 指定接收到下一個消息時要用到的行為。

以上動作不含有順序執行的假設,因此可以並行進行。

發送者與已發送通信的解耦,是演員模型的根本優勢,演員模型啟用了異步通信並將控制結構當作消息傳遞的模式[2]

消息接收者是通過地址區分的,有時也被稱作「郵件地址」。因此演員只能和它擁有地址的演員通信。它可以通過接收到的信息獲取地址,或者獲取它創建的演員的地址。

演員模型的特徵是,演員內部或相互之間的計算本質上是並發性的,演員可以動態創建,演員地址包含在消息中,交互只有通過直接的異步消息傳遞通信,不限制消息到達的順序。

歷史 編輯

演員模型受到了LispSimulaSmalltalk-72基於權限的系統英語capability-based security分組交換的影響。其發展「受到由幾十、幾百、甚至幾千個獨立微處理機構成的高度並行計算機器的前景所推動,其中的每個處理機都有自己局部內存和通信處理器,它們通過高性能網絡進行通信。」[3]此後隨着採用多核眾核英語Manycore processor計算機架構的大規模並發計算的出現,人們已經重新燃起了對演員模型的興趣。

在Hewitt、Bishop和Steiger的1973年刊物之後,Irene Greif英語Irene Greif在1975年博士論文中,為演員模型開發出了一種操作語義[4]Henry Baker英語Henry Baker和Hewitt在1977年發表了演員系統的公理法則[5][6]。其他主要的里程碑包括:William Clinger英語William Clinger (computer scientist)的1981年學位論文,它介入了基於冪域英語Power domains指稱語義[3];還有Gul Agha英語Gul Agha的1985年學位論文,它進一步發展出基於transition的語義模型,從而補充了Clinger的模型[7]。這些工作促成了演員模型理論英語actor model theory的全面發展。

主要的軟件實現工作,由麻省理工學院消息傳遞語義小組完成,其成員包括Russ Atkinson、Giuseppe Attardi、Henry Baker、Gerry Barber、Peter Bishop、Peter de Jong、Ken Kahn、Henry Lieberman、Carl Manning、Tom Reinhardt、Richard Steiger和Dan Theriault。分別由加州理工學院的Chuck Seitz和麻省理工學院的Bill Dally領導的研究小組,致力於構造新的計算機架構,用以進一步發展演員模型中的消息傳遞。有關工作詳見演員模型實現英語Actor model implementation

演員模型的研究,已經開展於加州理工學院京都大學微電子及計算機技術公司英語Microelectronics and Computer Technology CorporationMIT人工智能實驗室斯坦福國際研究所斯坦福大學伊利諾伊大學厄巴納-香檳分校[8]巴黎第六大學比薩大學東京大學米澤日語米澤明憲研究室、荷蘭數學和計算機科學研究學會和其他一些地方。

使用演員模型編程 編輯

一些編程語言使用了演員模型或變種。這些語言包括:

早期的演員模型編程語言 編輯

後期的演員模型編程語言 編輯

演員模型庫及框架 編輯

演員模型庫及框架,允許用戶在沒有內置演員模型的語言中進行編程。這些框架包括:

名稱 狀態 最新發行 許可證 語言
ReActed[26] 活躍 2022-11-30 Apache 2.0 Java
Acteur[27] 活躍 2020-04-16[28] Apache-2.0 / MIT Rust
Bastion[29] 活躍 2020-08-12[30] Apache-2.0 / MIT Rust
Actix[31] 活躍 2019-05-30[32] MIT Rust
Aojet[33] 活躍 2016-10-17 MIT Swift
Actor[34] 活躍 2017-03-09 MIT Java
Actor4j[35] 活躍 2020-01-31 Apache 2.0 Java
Actr[36] 活躍 2019-04-09[37] Apache 2.0 Java
Vert.x[38] 活躍 2018-02-13 Apache 2.0 Java, Groovy, Javascript, Ruby, Scala, Kotlin, Ceylon
ActorFx[39] 不活躍 2013-11-13 Apache 2.0 .NET
Akka 活躍 2022-09-06[40] Apache 2.0 Java and Scala
Akka.NET[41] 活躍 2020-08-20[42] Apache 2.0 .NET
Apache Pekko[43] 活躍 2023-07-26[44] Apache 2.0 Java and Scala
Remact.Net[45] 不活躍 2016-06-26 MIT .NET, Javascript
Ateji PX[46] 不活躍 ? ? Java
czmq[47] 活躍 2016-11-10 MPL-2 C
F# MailboxProcessor 活躍 同於F# (內建核心庫) Apache License F#
Korus[48] 活躍 2010-02-04 GPL 3 Java
Kilim[49][50] 活躍 2018-11-09[51] MIT Java
ActorFoundry (基於Kilim) 不活躍 2008-12-28 ? Java
ActorKit[52] 活躍 2011-09-13[53] BSD Objective-C
Cloud Haskell[54] 活躍 2015-06-17[55] BSD Haskell
CloudI[56] 活躍 2023-10-27[57] MIT ATS, C/C++, Elixir/Erlang/LFE, Go, Haskell, Java, Javascript, OCaml, Perl, PHP, Python, Ruby
Clutter[58] 活躍 2017-05-12[59] LGPL 2.1 C, C++ (cluttermm), Python (pyclutter), Perl (perl-Clutter)
NAct[60] 不活躍 2012-02-28 LGPL 3.0 .NET
Nact[61] 活躍 2018-06-06[62] Apache 2.0 JavaScript/ReasonML
Retlang[63] 不活躍 2011-05-18[64] New BSD .NET
JActor[65] 不活躍 2013-01-22 LGPL Java
Jetlang[66] 活躍 2013-05-30[67] New BSD Java
Haskell-Actor[68] 不活躍? 2008 New BSD Haskell
GPars[69] 活躍 2014-05-09[70] Apache 2.0 Groovy
OOSMOS[71] 活躍 2019-05-09[72] GPL 2.0和商業(雙許可證) C. C++ friendly
Panini[73] 活躍 2014-05-22 MPL 1.1 自己的編程語言
PARLEY[74] 不活躍? 2007-22-07 GPL 2.1 Python
Peernetic[75] 活躍 2007-06-29 LGPL 3.0 Java
PostSharp[76] 活躍 2014-09-24 商業 / Freemium .NET
Pulsar[77] 活躍 2016-07-09[78] New BSD Python
Pulsar[79] 活躍 2016-02-18[80] LGPL/Eclipse Clojure
Pykka[81] 活躍 2019-05-07[82] Apache 2.0 Python
Termite Scheme[83] 不活躍? 2009-05-21 LGPL Scheme (Gambit實現)
Theron[84] 不活躍[85] 2014-01-18[86] MIT[87] C++
Thespian[88] 活躍 2020-03-10 MIT Python
Quasar[89] 活躍 2018-11-02[90] LGPL/Eclipse Java
Libactor[91] 不活躍? 2009 GPL 2.0 C
Actor-CPP[92] 活躍 2012-03-10[93] GPL 2.0 C++
S4[94] 不活躍 2012-07-31[95] Apache 2.0 Java
C++ Actor Framework (CAF)[96] 活躍 2020-02-08[97] Boost Software License 1.0 and BSD 3-Clause C++11
Celluloid[98] 活躍 2018-12-20[99] MIT Ruby
LabVIEW Actor Framework[100] 活躍 2012-03-01[101] National Instruments SLA[102] LabVIEW
LabVIEW Messenger Library[103] 活躍 2021-05-24 BSD LabVIEW
Otavia[104] 活躍 2024-01-02 Apache 2.0 Scala
Orbit[105] 活躍 2019-05-28[106] New BSD Java
QP框架 活躍 2019-05-25[107] GPL 2.0和商業(雙許可證) C and C++
libprocess[108] 活躍 2013-06-19 Apache 2.0 C++
SObjectizer[109] 活躍 2021-12-28[110] New BSD C++11
rotor[111] 活躍 2022-04-23[112] MIT License C++17
Orleans[113] 活躍 2023-07-11[114] MIT License C#/.NET
Skynet[115] 活躍 2016-07-11 MIT License C/Lua
Reactors.IO[116] 活躍 2016-06-14 BSD License Java/Scala
libagents[117] 活躍 2020-03-08 Free software license C++11
Proto.Actor[118] 活躍 2021-01-05 Free software license Go, C#, Python, JavaScript, Java, Kotlin
FunctionalJava[119] 活躍 2018-08-18[120] BSD 3-Clause Java
Riker[121] 活躍 2019-01-04 MIT License Rust
Comedy[122] 活躍 2019-03-09 EPL 1.0 JavaScript
VLINGO XOOM Actors[123] 活躍 2023-02-15 Mozilla Public License 2.0 Java, Kotlin, JVM languages, C# .NET
wasmCloud[124] 活躍 2021-03-23 Apache 2.0 WebAssembly (Rust, TinyGo, Zig, AssemblyScript)
ray[125] 活躍 2020-08-27 Apache 2.0 Python
DOTNETACTORS[126] 活躍 2021-06-14 MIT .NET, C#, Azure Service Bus
go-actor[127] 活躍 2022-08-16 GPL 3.0 Golang
Sento[128] 活躍 2022-11-21 Apache 2.0 Common Lisp
Xcraft Goblins[129] 活躍 2022-08-30 MIT JavaScript
Tarant[130] 活躍 2023-04-17 MIT Typescript, Javascript

注意這裡沒有列出全部框架和庫。

並發編程語言用例 編輯

儘管Erlang語言設計者並未如此表述[131],因其進程間通信是通過無共享英語Shared-nothing architecture異步英語Asynchrony (computer programming)消息傳遞系統運作,它一般被引證為採用演員模型的典型代表之一。在Erlang中,所有進程都有一個自己的「郵箱」,它是從其他進程已經發送過來而仍未被消費的消息的隊列。進程使用receive原語來檢索匹配預期模式的消息。一個消息處理例程針對每個模式依次測試這些消息,直到其中有一個匹配。在消息被消費並從郵箱中移除之時進程恢復執行。消息可以包含任何Erlang結構,包括原始類型(整數,浮點數、字符、原子)、元組、列表和函數。

下面例子展示了Erlang對分布式進程的內建支持:

% 建立一个进程并启用函数web:start_server(Port, MaxConnections)
ServerProcess = spawn(web, start_server, [Port, MaxConnections]),

% 在机器RemoteNode上建立一个远程进程并启用函数web:start_server(Port, MaxConnections)
RemoteProcess = spawn(RemoteNode, web, start_server, [Port, MaxConnections]),

% (异步的)发送消息到ServerProcess。消息包含一个元组,它具有原子"pause"和数"10"。
ServerProcess ! {pause, 10},

% 接收发给这个进程的消息
receive
    a_message -> do_something;
    {data, DataContent} -> handle(DataContent);
    {hello, Text} -> io:format("Got hello message: ~s", [Text]);
    {goodbye, Text} -> io:format("Got goodbye message: ~s", [Text])
end.

原型的演員編程語言 編輯

Hewitt在2006年發表了一個原型的演員編程語言,用意在於直接表達演員行為的重要方面[132]。消息採用如下表示法:

<標籤>[<元素>1 ... <元素>n]

編程語言的語義是通過將每個程序構造確定為有自己行為的演員來定義的。執行是通過在執行期間讓Eval消息在程序構造之間傳遞來建模的。

環境演員 編輯

每個Eval消息都有一個充當環境的演員的地址,它能夠進行標識符與值的綁定(binding)。environment演員是不可變的(immutable),也就是不變更的。

  • 當一個environment演員收到Request[Bind[identifier value] customer]的時候,建立一個新的環境演員environment』發送給customer,使得這個新環境演員收到Request[Lookup[identifier』] customer』]的時候,如果identifier同於identifier』,則發送給customer』一個Returned[value],否則發送給environment一個Request[Lookup[identifier』] customer』]
  • 當一個environment演員收到Request[Bind[<模式> String] customer]的時候,如果此<模式>形如Request[msg[paramerer] customer],匹配於String形如Request[msg[argument] customer],則建立一個新的環境演員environment』發送給customer,使得這個新環境演員收到Request[Lookup[parameter』] customer』]的時候,如果parameter』同於parameter,則發送給customer』一個Returned[argument],否則發送給customer一個Thrown[NotFound[<模式>]]
  • 當一個environment演員收到Request[Bind[identifier(parameter) value] customer]的時候,建立一個新的環境演員environment』發送給customer,使得這個新環境演員收到Request[Lookup[identifier』(argument)] customer』]的時候,如果identifier同於identifier』,則建立一個新的環境演員environment』』,發送給customer』一個Returned[value]和一個Returned[environment』』],否則發送給environment一個Request[Lookup[identifier』(argument)] customer』]。這個新環境演員environment』』在收到Request[Lookup[parameter』] customer』]的時候,如果parameter』同於parameter,則發送給customer』一個Returned[argument],否則發送給environment』一個Request[Lookup[parameter』] customer』]

上述環境演員建造在EmptyEnvironment演員之上,它在接收到Request[Lookup[identifier] customer]的時候,發送給customer一個Thrown[NotFound[identifier]]。當它收到Bind請求的時候,EmptyEnvironment表現的如同上述環境演員。

表達式 編輯

原型語言有如下種類的表達式,這裡的通信包括Request[...]Returned[...]Thrown[...],這裡的消息包括Eval[...]Bind[...]Lookup[...]

<標識符>
在收到Request[Eval[environment] customer]的時候,發送給environment一個Request[Lookup[<標識符>] customer]
send <接收者> <通信>
在收到Request[Eval[environment] customer]的時候,建立一個新演員evalCustomer1,發送給<接收者>一個Request[Eval[environment] evalCustomer1],使得
evalCustomer1收到通信Returned[theRecipient]的時候,建立一個新演員evalCustomer2,發送給<通信>一個Request[Eval[environment] evalCustomer2],使得
evalCustomer2收到通信Returned[theCommunication]的時候,發送給theRecipient一個theCommunication
<接收者>.<消息>
在收到Request[Eval[environment] customer]的時候,建立一個新演員evalCustomer1,發送<接收者>一個Request[Eval[environment] evalCustomer1],使得
evalCustomer1收到通信Returned[theRecipient]的時候,建立一個新演員evalCustomer2,發送給<消息>一個Request[Eval[environment] evalCustomer2],使得
evalCustomer2收到通信Returned[theMessage]的時候,發送給theRecipient一個Request[theMessage customer]
receiver ... <模式>i <表達式>i ...
在收到Request[Eval[environment] customer]的時候,發送給customer一個新演員theReceiver,使得
theReceiver收到通信內容com的時候,建立一個新演員bindingCustomer,並發送給environment一個Request[Bind[<模式>i com] bindingCustomer],而且
  1. 如果bindingCustomer收到Returned[environment』],發送給<表達式>i一個Request[Eval[environment』]]
  2. 不然如果bindingCustomer收到Thrown[...],嘗試<模式>i+1
behavior ... <模式>i <表達式>i ...
在收到Request[Eval[environment] customer]的時候,發送給customer一個新演員theReceiver,使得
theReceiver收到Request[message customer』]的時候,建立一個新演員bindingCustomer,並發送給environment一個Request[bind[<模式>i message] customer』],而且
  1. 如果bindingCustomer收到Returned[environment』],發送給<表達式>i一個Request[Eval[environment』] customer』]
  2. 不然如果bindingCustomer收到Thrown[...],嘗試<模式>i+1
{<表達式>1, <表達式>2}
在收到Request[Eval[environment] customer]的時候,發送給<表達式>1一個Request[Eval[environment]],而且並發的發送給<表達式>2一個Request[Eval[environment] customer]
let <標識符> = <表達式> in <表達式>
在收到message[Eval[environment] customer]的時候,建立一個新演員evalCustomer,並發送給<表達式>一個Request[Eval[environment] evalCustomer]
evalCustomer收到Returned[theValue]的時候,建立一個新演員bindingCustomer,並發送給environment一個Request[bind[<標識符> theValue] bindingCustomer]
bindingCustomer收到Returned[environment』]的時候,發送給<expression>一個Request[Eval[environment』] customer]
serializer <表達式>
在收到Request[Eval[environment] customer]的時候,發送給customer一個Returned[theSerializer],這裡的theSerializer是新演員,使得發送到theSerializer的通信按FIFO次序由行為演員處理,行為演員初始是<表達式>.Eval[environment],而且
theSerializer收到通信內容com的時候,建立一個新演員customer』,發送給行為演員一個Request[com customer』],使得
customer』收到Returned[value]Returned[theNextBehavior]的時候,Returned[value]被發送給customer,而theNextBehaviortheSerializer用作下次通信的行為演員。

例子程序 編輯

下面是簡單的存儲單元格(cell)的例子腳本(script),它可以包含任何演員地址:

Cell ≡
receiver
Request[Create[initial] customer]
send customer Returned[serializer ReadWrite(initial)]

上述腳本將建立一個存儲單元格,它採用的行為ReadWrite定義如下:

ReadWrite(contents) ≡
behavior
Request[read[] customer]
{send customer Returned[contents], Returned[ReadWrite(contents)]}
Request[write[x] customer]
{send customer Returned[], Returned[ReadWrite(x)]}

例如,下列表達式建立一個單元格x,具有初始內容5,並接着並發的向它寫值7和9。

let x = Cell.Create[5] in {x.write[7], x.write[9], x.read[]}

上述表達式的值是5、7或9。

影響 編輯

演員模型在並發計算的理論發展和實踐軟件開發中都有影響。

理論 編輯

演員模型影響了π-演算和隨後的進程演算的發展。在Robin Milner的圖靈獎獲獎演說中,他寫到[133]

純lambda演算現在只使用兩種東西來建造:項和變量。我們在進程演算上也能實現同樣的經濟性嗎?Carl Hewitt憑藉其演員模型,很久以前就應對了這個挑戰;他宣告了值、在值上的算子和進程,都應該是同一種東西:即演員。

這個目標打動了我,因為它蘊涵了表達式有着同質性和完整性 ... 但是很久以後我才明白了如何依據代數演算來達成這個目標 ...

因此本着Hewitt的精神,我們的第一步,就是要求由項指示或由名字訪問的所有東西,包括值、寄存器、算子、進程、對象,都是同一種東西;它們都應當是進程。

實踐 編輯

演員模型在商業實踐中已經有了巨大的影響。例如,Twitter將演員用於可伸縮性應用[134]。還有,Microsoft在其開發的異步代理庫中使用了演員模型[135]

參見 編輯

引用 編輯

  1. ^ Carl Hewitt; Peter Bishop and Richard Steiger. A Universal Modular Actor Formalism for Artificial Intelligence (PDF). IJCAI. 1973 [2020-05-06]. (原始內容存檔 (PDF)於2021-02-25). 
  2. ^ Carl Hewitt. Viewing Control Structures as Patterns of Passing Messages頁面存檔備份,存於網際網路檔案館). Journal of Artificial Intelligence. June 1977.
  3. ^ 3.0 3.1 William Clinger. Foundations of Actor Semantics. Mathematics Doctoral Dissertation. MIT. June 1981. hdl:1721.1/6935. 
  4. ^ Irene Greif. Semantics of Communicating Parallel Processes. EECS Doctoral Dissertation. MIT. August 1975. 
  5. ^ Henry Baker; Carl Hewitt. Laws for Communicating Parallel Processes. IFIP. August 1977. 
  6. ^ Laws for Communicating Parallel Processes (PDF). 10 May 1977 [2020-05-04]. (原始內容存檔 (PDF)於2016-06-24). 
  7. ^ Gul Agha. Actors: A Model of Concurrent Computation in Distributed Systems. Doctoral Dissertation. MIT Press. 1986. hdl:1721.1/6952. 
  8. ^ Home. Osl.cs.uiuc.edu. [2012-12-02]. (原始內容存檔於2013-02-22). 
  9. ^ Henry Lieberman. A Preview of Act 1. MIT AI memo 625. June 1981. 
  10. ^ Henry Lieberman. Thinking About Lots of Things at Once without Getting Confused: Parallelism in Act 1. MIT AI memo 626. June 1981. 
  11. ^ Jean-Pierre Briot. Acttalk: A framework for object-oriented concurrent programming-design and experience 2nd France-Japan workshop. 1999.
  12. ^ Ken Kahn. A Computational Theory of Animation MIT EECS Doctoral Dissertation. August 1979.
  13. ^ William Athas and Nanette Boden Cantor: An Actor Programming System for Scientific Computing in Proceedings of the NSF Workshop on Object-Based Concurrent Programming. 1988. Special Issue of SIGPLAN Notices.
  14. ^ Darrell Woelk. Developing InfoSleuth Agents Using Rosette: An Actor Based Language Proceedings of the CIKM '95 Workshop on Intelligent Information Agents. 1995.
  15. ^ Dedecker J., Van Cutsem T., Mostinckx S., D'Hondt T., De Meuter W. Ambient-oriented Programming in AmbientTalk. In 「Proceedings of the 20th European Conference on Object-Oriented Programming (ECOOP), Dave Thomas (Ed.), Lecture Notes in Computer Science Vol. 4067, pp. 230-254, Springer-Verlag.」, 2006
  16. ^ Darryl K. Taft. Microsoft Cooking Up New Parallel Programming Language. Eweek.com. 2009-04-17 [2012-12-02]. (原始內容存檔於2012-07-29). 
  17. ^ Brandauer, Stephan; et al. Parallel objects for multicores: A glimpse at the parallel language encore.. Formal Methods for Multicore Programming. (Springer International Publishing). 2015: 1–56. 
  18. ^ Humus. Dalnefre.com. [2012-12-02]. (原始內容存檔於2021-02-07). 
  19. ^ The Pony Language. [2022-01-11]. (原始內容存檔於2018-09-04). 
  20. ^ Clebsch, Sylvan; Drossopoulou, Sophia; Blessing, Sebastian; McNeil, Andy. Deny capabilities for safe, fast actors. Proceedings of the 5th International Workshop on Programming Based on Actors, Agents, and Decentralized Control - AGERE! 2015. 2015: 1–12. ISBN 9781450339018. doi:10.1145/2824815.2824816.  by Sylvan Clebsch, Sophia Drossopoulou, Sebastian Blessing, Andy McNeil
  21. ^ The P Language. 2019-03-08 [2020-05-06]. (原始內容存檔於2021-01-15). 
  22. ^ The P# Language. 2019-03-12 [2020-05-06]. (原始內容存檔於2021-03-23). 
  23. ^ Carlos Varela and Gul Agha. Programming Dynamically Reconfigurable Open Systems with SALSA. ACM SIGPLAN Notices. OOPSLA'2001 Intriguing Technology Track Proceedings. 2001, 36. 
  24. ^ Philipp Haller and Martin Odersky. Event-Based Programming without Inversion of Control (PDF). Proc. JMLC 2006. September 2006 [2014-08-04]. (原始內容存檔 (PDF)於2020-11-09). 
  25. ^ Philipp Haller and Martin Odersky. Actors that Unify Threads and Events (PDF). Technical report LAMP 2007. January 2007 [2014-08-04]. (原始內容 (PDF)存檔於2011-06-07). 
  26. ^ ReActed頁面存檔備份,存於網際網路檔案館
  27. ^ Acteur頁面存檔備份,存於網際網路檔案館
  28. ^ acteur - 0.9.1· David Bonet · Crates.io. crates.io. [2020-04-16]. (原始內容存檔於2021-02-05). 
  29. ^ Bastion頁面存檔備份,存於網際網路檔案館
  30. ^ Bulut, Mahmut. Bastion on Crates.io. Crates.io. 2019-12-15 [2019-12-15]. (原始內容存檔於2021-02-05). 
  31. ^ Actix頁面存檔備份,存於網際網路檔案館
  32. ^ actix - 0.8.3· Nikolay Kim · Crates.io. crates.io. [2019-06-03]. (原始內容存檔於2021-02-05). 
  33. ^ Aojet頁面存檔備份,存於網際網路檔案館
  34. ^ Actor頁面存檔備份,存於網際網路檔案館
  35. ^ Actor4j頁面存檔備份,存於網際網路檔案館
  36. ^ Actr頁面存檔備份,存於網際網路檔案館
  37. ^ Releases · zakgof/actr · GitHub. Github.com. [2019-04-16]. (原始內容存檔於2020-10-26). 
  38. ^ Vert.x頁面存檔備份,存於網際網路檔案館
  39. ^ ActorFx頁面存檔備份,存於網際網路檔案館
  40. ^ Akka 2.6.20 Released · Akka. Akka. 2022-09-06 [2022-12-23]. (原始內容存檔於2022-09-24). 
  41. ^ Akka.NET頁面存檔備份,存於網際網路檔案館
  42. ^ Akka.NET v1.4.10 Stable Release GitHub - akkadotnet/akka.net: Port of Akka actors for .NET., Akka.NET, 2020-10-01 [2020-10-01], (原始內容存檔於2021-02-24) 
  43. ^ Apache Pekko. [2024-02-13]. (原始內容存檔於2024-02-10). 
  44. ^ Apache Pekko (Incubating), Apache Software Foundation, [2024-02-13], (原始內容存檔於2023-12-04) 
  45. ^ Remact.Net頁面存檔備份,存於網際網路檔案館
  46. ^ Ateji PX
  47. ^ czmq頁面存檔備份,存於網際網路檔案館
  48. ^ Korus頁面存檔備份,存於網際網路檔案館
  49. ^ Kilim頁面存檔備份,存於網際網路檔案館
  50. ^ Srinivasan, Sriram; Alan Mycroft. Kilim: Isolation-Typed Actors for Java (PDF). European Conference on Object Oriented Programming ECOOP 2008. Cyprus. 2008 [2016-02-25]. (原始內容存檔 (PDF)於2020-10-28). 
  51. ^ Releases · kilim/kilim · GitHub. Github.com. [2019-06-03]. (原始內容存檔於2020-10-16). 
  52. ^ ActorKit頁面存檔備份,存於網際網路檔案館
  53. ^ Commit History · stevedekorte/ActorKit · GitHub. Github.com. [2016-02-25]. 
  54. ^ Cloud Haskell[失效連結]
  55. ^ Commit History · haskell-distributed/distributed-process · GitHub. Github.com. [2012-12-02]. (原始內容存檔於2017-03-24). 
  56. ^ CloudI頁面存檔備份,存於網際網路檔案館
  57. ^ CloudI: A Cloud at the lowest level · Activity. sourceforge.net. [2024-01-03]. (原始內容存檔於2024-01-04). 
  58. ^ Clutter頁面存檔備份,存於網際網路檔案館
  59. ^ Tags · GNOME/clutter · GitLab. gitlab.gnome.org. [2019-06-03]. (原始內容存檔於2019-06-03). 
  60. ^ NAct頁面存檔備份,存於網際網路檔案館
  61. ^ Nact頁面存檔備份,存於網際網路檔案館
  62. ^ Releases · ncthbrt/nact · GitHub. [2019-06-03]. (原始內容存檔於2020-11-27). 
  63. ^ Retlang頁面存檔備份,存於網際網路檔案館
  64. ^ Changes - retlang - Message based concurrency in .NET - Google Project Hosting. [2016-02-25]. (原始內容存檔於2015-11-24). 
  65. ^ JActor
  66. ^ Jetlang頁面存檔備份,存於網際網路檔案館
  67. ^ jetlang-0.2.9-bin.zip - jetlang - jetlang-0.2.9-bin.zip - Message based concurrency for Java - Google Project Hosting. 2012-02-14 [2016-02-25]. (原始內容存檔於2016-01-14). 
  68. ^ Haskell-Actor頁面存檔備份,存於網際網路檔案館
  69. ^ GPars頁面存檔備份,存於網際網路檔案館
  70. ^ GPars Releases. GitHub. [2016-02-25]. (原始內容存檔於2020-09-04). 
  71. ^ OOSMOS頁面存檔備份,存於網際網路檔案館
  72. ^ Releases · oosmos/oosmos · GitHub. GitHub. [2019-06-03]. (原始內容存檔於2020-11-13). 
  73. ^ Panini頁面存檔備份,存於網際網路檔案館
  74. ^ PARLEY
  75. ^ Peernetic
  76. ^ PostSharp頁面存檔備份,存於網際網路檔案館
  77. ^ Pulsar頁面存檔備份,存於網際網路檔案館
  78. ^ Pulsar Design and Actors. (原始內容存檔於2015-07-04). 
  79. ^ Pulsar頁面存檔備份,存於網際網路檔案館
  80. ^ Pulsar documentation. (原始內容存檔於2013-07-26). 
  81. ^ Pykka頁面存檔備份,存於網際網路檔案館
  82. ^ Changes – Pykka 2.0.0 documentation. pykka.org. [2019-06-03]. (原始內容存檔於2021-02-05). 
  83. ^ Termite Scheme頁面存檔備份,存於網際網路檔案館
  84. ^ Theron
  85. ^ Theron – Ashton Mason. [2018-08-29]. (原始內容存檔於2019-03-31). 
  86. ^ Theron - Version 6.00.02 released. Theron-library.com. [2016-02-25]. (原始內容存檔於2016-03-16). 
  87. ^ Theron. Theron-library.com. [2016-02-25]. (原始內容存檔於2016-03-04). 
  88. ^ Thespian頁面存檔備份,存於網際網路檔案館
  89. ^ Quasar頁面存檔備份,存於網際網路檔案館
  90. ^ Releases · puniverse/quasar · GitHub. [2019-06-03]. (原始內容存檔於2020-12-15). 
  91. ^ Libactor頁面存檔備份,存於網際網路檔案館
  92. ^ Actor-CPP頁面存檔備份,存於網際網路檔案館
  93. ^ Changes - actor-cpp - An implementation of the actor model for C++ - Google Project Hosting. [2012-12-02]. (原始內容存檔於2015-11-18). 
  94. ^ S4 頁面存檔備份,存於網際網路檔案館
  95. ^ Commit History · s4/s4 · Apache. apache.org. [2016-01-16]. (原始內容存檔於2016-03-06). 
  96. ^ C++ Actor Framework (CAF)頁面存檔備份,存於網際網路檔案館
  97. ^ Releases · actor-framework/actor-framework · GitHub. Github.com. [2020-03-07]. (原始內容存檔於2021-03-26). 
  98. ^ Celluloid頁面存檔備份,存於網際網路檔案館
  99. ^ celluloid | RubyGems.org | your community gem host. RubyGems.org. [2019-06-03]. (原始內容存檔於2020-09-29). 
  100. ^ LabVIEW Actor Framework
  101. ^ Community: Actor Framework, LV 2011 revision (version 3.0.7). Decibel.ni.com. 2011-09-23 [2016-02-25]. (原始內容存檔於2016-10-13). 
  102. ^ National Instruments SLA頁面存檔備份,存於網際網路檔案館
  103. ^ LabVIEW Messenger Library頁面存檔備份,存於網際網路檔案館
  104. ^ Otavia. [2024-02-13]. (原始內容存檔於2024-01-10). 
  105. ^ Orbit頁面存檔備份,存於網際網路檔案館
  106. ^ Releases · orbit/orbit · GitHub. GitHub. [2019-06-03]. 
  107. ^ QP Real-Time Embedded Frameworks & Tools - Browse Files at. Sourceforge.net. [2019-06-03]. (原始內容存檔於2021-02-24). 
  108. ^ libprocess頁面存檔備份,存於網際網路檔案館
  109. ^ SObjectizer頁面存檔備份,存於網際網路檔案館
  110. ^ Releases · Stiffstream/sobjectizer · GitHub. GitHub. [2022-05-11]. (原始內容存檔於2020-10-19). 
  111. ^ rotor頁面存檔備份,存於網際網路檔案館
  112. ^ Releases · basiliscos/cpp-rotor· GitHub. GitHub. [2022-05-17]. (原始內容存檔於2020-09-15). 
  113. ^ Orleans頁面存檔備份,存於網際網路檔案館
  114. ^ Releases · dotnet/orleans · GitHub. GitHub. [2022-09-21]. (原始內容存檔於2020-12-04). 
  115. ^ Skynet頁面存檔備份,存於網際網路檔案館
  116. ^ Reactors.IO頁面存檔備份,存於網際網路檔案館
  117. ^ libagents頁面存檔備份,存於網際網路檔案館
  118. ^ Proto.Actor頁面存檔備份,存於網際網路檔案館
  119. ^ FunctionalJava頁面存檔備份,存於網際網路檔案館
  120. ^ FunctionalJava releases. GitHub. [2018-08-23]. (原始內容存檔於2021-01-15). 
  121. ^ Riker頁面存檔備份,存於網際網路檔案館
  122. ^ Comedy頁面存檔備份,存於網際網路檔案館
  123. ^ VLINGO XOOM Actors. [2021-01-15]. (原始內容存檔於2020-11-29). 
  124. ^ wasmCloud. [2023-07-02]. (原始內容存檔於2023-07-02). 
  125. ^ ray頁面存檔備份,存於網際網路檔案館
  126. ^ DOTNETACTORS. [2022-12-23]. (原始內容存檔於2022-12-24). 
  127. ^ go-actor. [2022-12-23]. (原始內容存檔於2022-12-23). 
  128. ^ Sento. [2022-12-23]. (原始內容存檔於2023-04-05). 
  129. ^ Xcraft Goblins. [2022-12-23]. (原始內容存檔於2023-06-07). 
  130. ^ Tarant. [2023-07-02]. (原始內容存檔於2023-05-27). 
  131. ^ Armstrong, Joe. Erlang. Communications of the ACM. September 2010, 53 (9): 68–75 [2020-05-07]. doi:10.1145/1810891.1810910. (原始內容存檔於2020-06-09). Erlang is conceptually similar to the occam programming language, though it recasts the ideas of CSP in a functional framework and uses asynchronous message passing instead of the synchronous message passing in CSP. 
  132. ^ Carl Hewitt. The repeated demise of logic programming and why it will be reincarnated. What Went Wrong and Why: Lessons from AI Research and Applications. Technical Report SS-06-08. AAAI Press. March 2006.
  133. ^ Milner, Robin. Elements of interaction. Communications of the ACM. 1993, 36: 78–89. doi:10.1145/151233.151240. 
  134. ^ How Twitter Is Scaling « Waiming Mok's Blog. Waimingmok.wordpress.com. 2009-06-27 [2012-12-02]. (原始內容存檔於2021-02-05). 
  135. ^ "Actor-Based Programming with the Asynchronous Agents Library頁面存檔備份,存於網際網路檔案館)" MSDN September 2010.

延伸閱讀 編輯

外部連結 編輯