Actor并發(fā)編程模型淺析

一.Actor模型介紹

在單核 CPU 發(fā)展已經(jīng)達(dá)到一個(gè)瓶頸的今天持搜,要增加硬件的速度更多的是增加 CPU 核的數(shù)目。而針對(duì)這種情況,要使我們的程序運(yùn)行效率提高宏娄,那么也應(yīng)該從并發(fā)方面入手。傳統(tǒng)的多線程方法又極其容易出現(xiàn) Bug 而難以維護(hù)逮壁,不過別擔(dān)心孵坚,今天將要介紹另一種并發(fā)的模式能一定程度解決這些問題,那就是 Actor 模型窥淆。

Actor 模型其實(shí)就是定義一組規(guī)則卖宠,這些規(guī)則規(guī)定了一組系統(tǒng)中各個(gè)模塊如何交互及回應(yīng)。在一個(gè) Actor 系統(tǒng)中忧饭,Actor 是最小的單元模塊扛伍,系統(tǒng)由多個(gè) Actor 組成。每個(gè) Actor 有兩個(gè)東西词裤,一個(gè)是 mailbox刺洒,一個(gè)是自身狀態(tài)。同時(shí) Actor 有接收和發(fā)送的功能吼砂。下面代碼給出一個(gè)大概的 Actor 樣例:

trait Actor {
  //持有一個(gè)表示自身狀態(tài)的私有變量
  val state:Integer = 0;
  //持有一個(gè)mailbox 的隊(duì)列
  val mailBox:mutable.Queue[Message] = scala.collection.mutable.Queue[Message]()
  def send(message : Message): Unit ={
      ...
  }
  def recive(): Unit ={
      ...
  }
}

當(dāng)一個(gè) Actor 接收到消息后逆航,它會(huì)執(zhí)行下面三種操作中的一種:

  • 創(chuàng)建其他actors。
  • 向其他actors發(fā)送消息渔肩。
  • 修改自身狀態(tài)因俐。
    需要注意的是,盡管許多actors同時(shí)運(yùn)行周偎,但是一個(gè)actor只能順序地處理消息抹剩。也就是說其它actors發(fā)送了三條消息給一個(gè)actor,這個(gè)actor只能一次處理一條蓉坎。所以如果你要并行處理3條消息吧兔,你需要把這條消息發(fā)給3個(gè)actors。

下面這張圖展示了一個(gè)簡(jiǎn)單的 Actor 模型系統(tǒng):

image

了解了 Actor 模型的大概規(guī)則后袍嬉,我們用兩個(gè)具體的例子來看看 Actor 模型的妙處以及不足吧境蔼。

二. 兩個(gè)例子

2.1 素?cái)?shù)計(jì)算

假設(shè)我們現(xiàn)在有一個(gè)任務(wù)灶平,需要找出100000以內(nèi)素?cái)?shù)個(gè)數(shù),并且使用多線程的方式實(shí)現(xiàn)箍土。

下圖展示了使用共享內(nèi)存的方式和以Actor模型的方式進(jìn)行并發(fā)執(zhí)行逢享。


Actor 素?cái)?shù)計(jì)算

這里展示了兩種處理并發(fā)的不同思路,傳統(tǒng)的方式是通過鎖/同步的方式來實(shí)現(xiàn)并發(fā)吴藻,每次同步獲取當(dāng)前值瞒爬,并讓一個(gè)線程去判斷值是否為素?cái)?shù),是的話再通過同步的方式對(duì)計(jì)數(shù)器加1(這里的說明只是作為提供思路用沟堡,這種方法自然有很大的優(yōu)化空間)侧但。

而使用 Actor 模型則不一樣,它將這一過程拆分成幾個(gè)模塊航罗,即拆分成幾個(gè) Actor 禀横。每個(gè) Actor 負(fù)責(zé)不同的部分,通過消息傳遞的方式讓這幾個(gè) Actor 協(xié)同工作粥血,并且其中涉及到主要計(jì)算的 Actor 可以有多個(gè)柏锄,通過多個(gè) Actor 協(xié)同工作實(shí)現(xiàn)并發(fā)。

2.2 銀行轉(zhuǎn)賬

銀行轉(zhuǎn)賬的任務(wù)描述很簡(jiǎn)單复亏,假設(shè)有兩個(gè)用戶趾娃,現(xiàn)在用戶A向用戶B轉(zhuǎn)賬100元,這個(gè) Actor 模型該如何設(shè)計(jì)呢缔御?

用戶 A 和 用戶 B 明顯是兩個(gè) Actor 抬闷,但我們同時(shí)還需要一個(gè)可以控制用戶A Actor 和用戶B Actor 的 Actor ,我們稱之為 轉(zhuǎn)賬管家 Actor耕突。那么流程圖如下笤成。


Actor 銀行轉(zhuǎn)賬

可以看到,當(dāng)一個(gè)轉(zhuǎn)賬需求過來的時(shí)候有勾,Actor 管家會(huì)先向 用戶A Actor 發(fā)送扣款 100 元的信息疹启,接受到扣款成功消息后再發(fā)送消息給用戶B Actor古程,發(fā)送讓其增加 100 元的消息蔼卡。

一切看起來都很美好是吧,但這里面有一個(gè)問題挣磨,那就是在用戶A Actor 扣款期間雇逞,用戶B Actor 是不受限制的,此時(shí)對(duì)用戶B Actor 進(jìn)行操作是合法的茁裙!針對(duì)這種情況單純的Actor模型就顯得比較乏力了塘砸,需要加入其他機(jī)制以保證一致性。

看到這你就明白了晤锥,Actor 模型并非萬能的掉蔬,它有一定的缺點(diǎn)廊宪。那就是針對(duì)一致性要求比較強(qiáng)的場(chǎng)景比較乏力。

三. 為什么會(huì)出現(xiàn) Actor 模型

接下來我們來聊聊為什么會(huì)有 Actor 模型這種并發(fā)編程模型出現(xiàn)女轿。

我們需要先說說并發(fā)性中的一致性隔離性箭启。

一致性即讓數(shù)據(jù)保持一致,比如銀行轉(zhuǎn)賬例子中蛉迹,用戶A 轉(zhuǎn)給 用戶B 100塊錢傅寡,沒有其他干擾的情況下,轉(zhuǎn)賬完成時(shí)北救。用戶A 的賬戶必然減少 100 元荐操,用戶B 的賬戶必然增加100 元,這就滿足了一致性珍策。不能說用戶A 減少50 或用戶B 增加了 200托启。

隔離性可以理解為犧牲一部分的一致性需求,而獲得性能的提高膛壹。打個(gè)比方驾中,在完全一致的情況下,任務(wù)都是串行的模聋,這時(shí)候也就不存在隔離性了肩民。

明白這些之后,你就直到為什么會(huì)有 Actor 模型了链方。

傳統(tǒng)并發(fā)模式持痰,共享內(nèi)存是傾向于強(qiáng)一致性弱隔離性的。比如悲觀鎖/同步的方式祟蚀,其實(shí)就是使用強(qiáng)一致性的方式控制并發(fā)工窍。而Actor 模型天然是強(qiáng)隔離性且弱一致性,所以 Actor 模型在并發(fā)中有良好的性能前酿,且易于控制和管理患雏。

這樣你就明白 Actor 模型適合于什么樣的并發(fā)場(chǎng)景了,當(dāng)對(duì)一致性需求不是很高的情況下且對(duì)性能需求較高時(shí)罢维,Actor 模型無疑是一個(gè)值得嘗試的方案淹仑。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市肺孵,隨后出現(xiàn)的幾起案子匀借,更是在濱河造成了極大的恐慌,老刑警劉巖平窘,帶你破解...
    沈念sama閱讀 216,744評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吓肋,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡瑰艘,警方通過查閱死者的電腦和手機(jī)是鬼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門肤舞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人均蜜,你說我怎么就攤上這事萨赁。” “怎么了兆龙?”我有些...
    開封第一講書人閱讀 163,105評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵杖爽,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我紫皇,道長(zhǎng)慰安,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,242評(píng)論 1 292
  • 正文 為了忘掉前任聪铺,我火速辦了婚禮化焕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘铃剔。我一直安慰自己撒桨,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,269評(píng)論 6 389
  • 文/花漫 我一把揭開白布键兜。 她就那樣靜靜地躺著凤类,像睡著了一般。 火紅的嫁衣襯著肌膚如雪普气。 梳的紋絲不亂的頭發(fā)上谜疤,一...
    開封第一講書人閱讀 51,215評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音现诀,去河邊找鬼夷磕。 笑死,一個(gè)胖子當(dāng)著我的面吹牛仔沿,可吹牛的內(nèi)容都是我干的坐桩。 我是一名探鬼主播,決...
    沈念sama閱讀 40,096評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼封锉,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼绵跷!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起烘浦,我...
    開封第一講書人閱讀 38,939評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤抖坪,失蹤者是張志新(化名)和其女友劉穎萍鲸,沒想到半個(gè)月后闷叉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,354評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡脊阴,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,573評(píng)論 2 333
  • 正文 我和宋清朗相戀三年握侧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蚯瞧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,745評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡品擎,死狀恐怖埋合,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情萄传,我是刑警寧澤甚颂,帶...
    沈念sama閱讀 35,448評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站秀菱,受9級(jí)特大地震影響振诬,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜衍菱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,048評(píng)論 3 327
  • 文/蒙蒙 一赶么、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧脊串,春花似錦辫呻、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至缕坎,卻和暖如春雄人,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背念赶。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工础钠, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人叉谜。 一個(gè)月前我還...
    沈念sama閱讀 47,776評(píng)論 2 369
  • 正文 我出身青樓旗吁,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親停局。 傳聞我的和親對(duì)象是個(gè)殘疾皇子很钓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,652評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • Actor系統(tǒng)的實(shí)體 在Actor系統(tǒng)中,actor之間具有樹形的監(jiān)管結(jié)構(gòu)董栽,并且actor可以跨多個(gè)網(wǎng)絡(luò)節(jié)點(diǎn)進(jìn)行透...
    JasonDing閱讀 3,341評(píng)論 2 6
  • 前言 一 不得不說的Actor模型 1.1 Actor模型的誕生與發(fā)展 1.2 Actor模型是什么码倦? 1.3 A...
    hedgehog1112閱讀 412評(píng)論 0 0
  • 周期性自我否定綜合癥,表現(xiàn)有锭碳,以半年或一個(gè)周期為循環(huán)袁稽,患者會(huì)否定自己,懷疑人生擒抛,懷疑世界推汽,是抑郁癥前兆
    漫慢兔閱讀 1,053評(píng)論 0 0
  • 文/蘭露 教育日志2017-3-29 女兒幼兒園老師說,最近女兒特別喜歡玩蒙氏數(shù)學(xué)教具暖夭。我想到前幾天女兒告訴我锹杈,“...
    蘭露兒閱讀 933評(píng)論 15 17
  • 不知不覺到這個(gè)點(diǎn)了,今天很有收獲迈着,很開心嬉橙。
    恒心者閱讀 149評(píng)論 0 1