成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

看Erlang中Actor模型的執(zhí)行方式和優(yōu)劣

開發(fā) 開發(fā)工具
Erlang基于Actor模型實現(xiàn),甚至可以說,沒有Erlang在業(yè)界豎立的豐碑,Actor模型便不會如此受人關(guān)注。本文介紹了Erlang中Actor模型的執(zhí)行方式和優(yōu)劣。

Actor模型為并行而生。由于現(xiàn)在單臺機器中獨立的計算單元也越來越多,Actor模型的重要性也越來越大。Actor模型的理念非常簡單:天下萬物皆為Actor,Actor之間通過發(fā)送消息進行通信。不同的Actor可以同時處理各自的消息,從而獲得了大規(guī)模的并發(fā)能力。

Erlang基于Actor模型實現(xiàn),我們甚至可以這樣認為,沒有Erlang在業(yè)界豎立的豐碑,Actor模型便不會如此受人關(guān)注。目前,幾乎所有的主流開發(fā)平臺上都有了Actor模型的實現(xiàn),如Java平臺下的Jetlang以及.NET平臺下的MS CCR和Retlang;還有一些Actor框架專為特定語言設(shè)計,如F#的MailboxProcessor以及Scala的Actor類庫;甚至微軟還基于MS CCR構(gòu)建了一門新的語言Axum。

不過對于.NET平臺下的開發(fā)人員來說,我們最常用的語言是C#。無論您是在使用MS CCR還是Retlang(亦或是我寫的ActorLite),在消息的執(zhí)行階段總是略顯尷尬。本文的目的便是提出一種適合C# Actor的消息執(zhí)行方式,而這種執(zhí)行方式還會成為我以后公開的C#中“模式匹配”的基礎(chǔ)。

Erlang中的執(zhí)行方式

本文將分為三個部分,您目前正在閱讀的***部分,將會觀察Erlang是如何執(zhí)行消息的。有對比才會有差距,也正是由于Erlang在Actor模型上的示范作用,我們才會意識到C# Actor在使用上有多么的不方便。

作為示例,我們還是使用最經(jīng)典的乒乓測試。乒乓測試的效果很簡單:ping和pong為兩個Actor對象,首先由ping向pong發(fā)送一個“Ping”消息,pong在接受到Ping消息之后,將會向ping發(fā)送一個“Pong”消息。在雙方“乒來乓去”幾個回合后,ping將會向pong發(fā)起“Finished”,從而停止交互。

乒乓測試的Erlang的實現(xiàn)代碼如下:

  1. -module(tut15).  
  2.  
  3. -export([start/0, ping/2, pong/0]).  
  4.  
  5. ping(0, Pong_PID) ->  
  6.     Pong_PID ! finished,  
  7.     io:format("ping finished~n", []);  
  8.  
  9. ping(N, Pong_PID) ->  
  10.     Pong_PID ! {ping, self()},  
  11.     receive  
  12.         pong ->  
  13.             io:format("Ping received pong~n", [])  
  14.     end,  
  15.     ping(N - 1, Pong_PID).  
  16.  
  17. pong() ->  
  18.     receive  
  19.         finished ->  
  20.             io:format("Pong finished~n", []);  
  21.         {ping, Ping_PID} ->  
  22.             io:format("Pong received ping~n", []),  
  23.             Ping_PID ! pong,  
  24.             pong()  
  25.     end.  
  26.  
  27. start() ->  
  28.     Pong_PID = spawn(tut15, pong, []),  
  29.     spawn(tut15, ping, [3, Pong_PID]).  

由于Erlang的函數(shù)式編程,尾遞歸,receive原語等特殊的語言特性,其乒乓測試的實現(xiàn)或語義上可能和其他語言有一定區(qū)別。不過我們現(xiàn)在還是關(guān)注Erlang在消息執(zhí)行時的特性:模式匹配。

雖然Erlang有諸多優(yōu)秀特性,但是它的數(shù)據(jù)抽象能力非常有限。在Erlang中常用的數(shù)據(jù)結(jié)構(gòu)只有三種:

原子(atom):原子使用小寫開頭的標(biāo)識符來表示。您可以把原子認為是一種字符串常量來看待,事實上它除了作為標(biāo)識之外也沒有額外的作用。

綁定(binding):大寫開頭的標(biāo)示符則為綁定,您可以近似地將其理解為“只能設(shè)置一次”的變量。一個綁定內(nèi)部可以保存任何數(shù)據(jù),如一個進程(Erlang的概念,并非指操作系統(tǒng)進程)的id,一個數(shù)字,或一個字符串。

元組(tuple):顧名思義,“元組”即為“單元的組合”,單元即為“原子”,“綁定”以及其他“元組”,通過某種方式結(jié)合起來。如上述代碼中{ping, Ping_PID}便是一個由原子“ping”和綁定“Ping_PID”組成。當(dāng)然您也可以寫成{do, {ping, Hello, World}, 7}這種嵌套的元組結(jié)構(gòu)。

Erlang中的receive原語的作用是接受下一條消息,直到有可用消息時它才會執(zhí)行下面的代碼。Erlang使用了模式匹配(Pattern Matching)來表現(xiàn)接受到不同消息時的邏輯分支。如pong的實現(xiàn):

  1. pong() ->  
  2.     receive  
  3.         finished ->  
  4.             io:format("Pong finished~n", []);  
  5.         {ping, Ping_PID} ->  
  6.             io:format("Pong received ping~n", []),  
  7.             Ping_PID ! pong,  
  8.             pong()  
  9.     end. 

在這段代碼中,receive將會設(shè)法將消息與兩種模式進行匹配:

原子finished,表示測試結(jié)束。

元組{ping, Ping_PID},表示一個元組,其中有兩個單元,首先是ping原子,其次是Ping_PID綁定。

在成功匹配了某個模式之后,其中的綁定也會隨之被賦上特定的值。如匹配了{ping, Ping_PID}之后,Ping_PID便被賦值為ping這個Actor對象的標(biāo)識符。而在接下來的邏輯中,便可以使用這些“綁定”中的值。由于元組的結(jié)構(gòu)不會受到任何限制,因此開發(fā)人員可以使用它來表示任意的抽象數(shù)據(jù)類型——更確切地說,應(yīng)該是“數(shù)據(jù)結(jié)構(gòu)”吧。

Erlang的優(yōu)勢與缺陷

Erlang在消息執(zhí)行方式上的優(yōu)勢在于靈活。Erlang是弱類型語言,在實現(xiàn)的時候可以任意調(diào)整消息的內(nèi)容,或是模式的要求。在Erlang進行模式匹配時往往有種約定:使用“原子”來表示“做什么”,而使用“綁定”來獲取操作所需要的“數(shù)據(jù)”,這種方式避免了冗余的cast和賦值,在使用的時候頗為靈活。然而,世上沒有***的事物,Erlang的消息執(zhí)行方式也有缺陷,而且是較為明顯的缺陷。

首先,Erlang的數(shù)據(jù)抽象能力實在太弱。如果編寫一個略顯復(fù)雜的應(yīng)用程序,您會發(fā)現(xiàn)程序里充斥著復(fù)雜的元組。您可能會疲于應(yīng)對那些擁有7、8個單元(甚至跟多)的元組,一個一個數(shù)過來到底某個綁定匹配的是第幾項,它的含義究竟是什么——一旦搞錯,程序便會出錯,而且想要調(diào)試都較為困難。因此,也有人戲稱Erlang是一門“天生會損害人視力的語言”(令人驚訝的是,那篇文章居然搜不到了,我們只能從搜索引擎上看出點痕跡了)。

而我認為,這并不是Erlang語言中***的問題,Erlang中***的問題也是其“弱類型”特性。例如,現(xiàn)在有一個公用的Service Locator服務(wù),任意類型的Actor都會像SL發(fā)送一個消息用于請求某個Service的位置,SL會在得到請求之后,向請求方發(fā)送一條消息表示應(yīng)答。試想,如果SL的功能需要有所修改,作為回復(fù)的消息結(jié)構(gòu)產(chǎn)生了變化,那么我們勢必要修改每一個請求方中所匹配的模式。由于消息的發(fā)送方和接受方在實際上完全分離,沒有基于任何協(xié)議,因此靜態(tài)檢查幾乎無從做起。一旦遇到這種需要大規(guī)模的修改的情況,Erlang程序便很容易產(chǎn)生差錯。因為一旦有所遺漏,系統(tǒng)便無法正常執(zhí)行下去了。

您對Erlang的感覺如何?這是一門會影響您編程思維的語言。老趙建議,即使您平時不會使用Erlang,也不妨簡單接觸一下這門語言。它的并發(fā)或容災(zāi)等特性給了我許多啟示。相信您會有不少收獲。

【編輯推薦】

  1. Erlang面向分布與并發(fā)的編程語言
  2. Erlang十分鐘快速入門
  3. 因并發(fā)而生 因云計算而熱:Erlang專家訪談實錄
  4. 淺析Erlang分布的核心技術(shù)
  5. 開源Erlang真的能成為下一代Java語言嗎?
責(zé)任編輯:yangsai 來源: 老趙點滴
相關(guān)推薦

2009-08-04 17:34:27

Erlang的Acto

2022-03-26 09:06:40

ActorCSP模型

2023-05-07 07:56:53

Python方式

2022-11-03 15:22:15

數(shù)據(jù)結(jié)構(gòu)Python

2009-08-04 17:52:25

ActorLite強類型

2009-08-05 16:04:27

C# Actor模型

2021-07-30 13:35:43

共享內(nèi)存 Actor

2012-11-15 10:18:11

IBMdw

2010-05-24 18:15:34

SVN中Branch和

2013-04-07 10:01:26

Java異常處理

2012-07-18 11:31:02

ibmdw

2009-07-30 10:59:44

Scala和Erlan多核

2023-08-10 08:01:36

RDB數(shù)據(jù)AOF

2023-01-05 08:27:04

Stream執(zhí)行流程

2009-08-04 17:27:18

Actor模型

2017-01-15 21:20:30

SparkApache Spar數(shù)據(jù)科學(xué)

2020-09-23 22:36:27

分布式架構(gòu)系統(tǒng)

2011-04-28 11:07:01

靈敏率音箱

2011-08-29 10:35:53

反射方式C#

2010-03-22 14:45:40

云計算
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 久久久国产一区二区三区 | 国产一区久久 | 日日骚网 | jlzzjlzz欧美大全 | 你懂的国产 | 久久久久久国产精品 | 国产在线1区 | 一区二区在线不卡 | 成人在线看片 | 欧美精品一区二区三区蜜桃视频 | 一区二区三区四区视频 | 日本不卡高字幕在线2019 | 免费一级片 | 自拍偷拍精品 | 国产福利91精品一区二区三区 | 日本天堂视频在线观看 | 香蕉一区 | 久久成人精品一区二区三区 | 日韩成人av在线 | 91网视频| 国产欧美一区二区精品久导航 | 亚洲毛片在线观看 | 久久久噜噜噜久久中文字幕色伊伊 | 色999视频 | 国产精品无码专区在线观看 | 亚洲视频一区在线 | 成人无遮挡毛片免费看 | 在线中文字幕av | 色综久久| 在线观看国产91 | 日韩欧美精品一区 | 久草免费电影 | 天天久久 | 一区二区三区四区视频 | 亚洲欧美日韩久久 | 中文字幕一区二区三 | 北条麻妃99精品青青久久主播 | 日本不卡一区 | 欧美黄色一级毛片 | 欧美一a一片一级一片 | 欧美亚洲国产一区 |