簡體   English   中英

演員模型是否僅限於特定語言?

[英]Is the actor model limited to specific languages?

我正在閱讀一篇關於 Erlang/OTP 和 actor 模型的有趣博客文章 我還聽說 Scala 支持 actor 模型。 從我目前收集到的一點點來看,actor 模型將處理分解為通過傳遞消息相互通信的組件。 通常,這些進程是不可變的。

這些功能是特定於語言的還是在架構級別上更多? 更具體地說,你不能用幾乎任何語言實現相同的actor模型,並且只使用某種形式的消息隊列在工作進程之間傳遞消息嗎? (例如,使用celery 之類的東西)。 還是像 Erlang 和 Scala 這樣的語言只是透明地、更快地做到這一點

當然,您幾乎可以用任何語言定義“Actor 庫”,但在 Erlang 中,該模型已嵌入語言中,並且實際上是唯一可用的並發模型。

雖然 Scala 的 actor 系統得到了很好的實現,但歸根結底,它仍然容易受到一些 Erlang 免疫的危害。 我會提請你注意這篇論文

對於以支持共享可變狀態的任何命令式語言實現的任何 Actor 庫,情況都是如此。

一個有趣的例外是 Nodes.js。 一些工作正在節點之間的actor上完成,這些actor可能表現出與Erlang相同的隔離屬性,僅僅是因為沒有共享的可變狀態。

演員模型並不局限於任何特定的平台或編程語言,它只是畢竟是一個模型。

Erlang 和 Scala 對這個模型有非常好的和有用的實現,它非常適合這些平台的典型技術堆棧,並有助於有效地解決某些類型的任務。

除了上面提到的幾點之外,事實上,在 Erlang 中,actor 模型是您可以編程的唯一方式,這使您的代碼從一開始就可擴展。 Erlang 進程是輕量級的,你可以在一台機器上生成 10-100K(我認為你不能用 python 來完成),這改變了你處理問題的方式。 例如,在我們的產品中,我們使用 Erlang 解析 Web 服務器日志並生成一個 Erlang 進程來處理每一行。 這樣,如果一個日志行損壞,或者處理它的進程崩潰,其他日志行不會發生任何事情。 另一個區別是,當您開始使用 OTP 時,您會獲得進程主管,並且您可以使進程連接,因此如果一個進程終止所有其他進程。 除此之外,Erlang 還具有其他一些不錯的特性(可以通過庫在其他語言中找到,但在這里它又被烘焙了),例如模式匹配和熱部署。

不,Actor 模型沒有任何特定於語言的內容。 事實上,您已經在問題中提到了 Scala,其中 actor 不是語言的一部分,而是作為庫實現的。 (實際上是三個相互競爭的圖書館。)

然而,就像函數式編程或面向對象編程一樣,直接支持 Actor 編程,或者至少支持一些更容易實現的抽象,在語言中會帶來非常不同的編程體驗。 任何曾經用 C 進行過函數式編程或面向對象編程的人都可能理解這一點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM