七周七并發(fā)讀書筆記之虎頭蛇尾

第五章 Actor

5.1 更加面向?qū)ο?/h3>

函數(shù)式編程不使用可變狀態(tài),也就避免了共享可變狀態(tài)帶來(lái)的問(wèn)題鳍刷。相比之下喇伯,使用actor模型保留了可變狀態(tài),只是不進(jìn)行共享颊糜。

Elixir是Erlang的虛擬機(jī)哩治。actor在Elixir中被稱為進(jìn)程,是個(gè)輕量級(jí)的概念衬鱼,比操作系統(tǒng)中的線程還要輕业筏。

5.2 第一天:消息和信箱

第一個(gè)actor
先來(lái)嘗試創(chuàng)建一個(gè)簡(jiǎn)單的actor,并向其發(fā)送一些消息鸟赫。我們將創(chuàng)建一個(gè)叫talker的actor蒜胖,其收到不同的消息時(shí)會(huì)輸出不同的結(jié)果。所發(fā)送的消息是一個(gè)元組(tuple)惯疙。

def module Talker do
    def loop do
        recevie do
            [:greet, name] -> IO.puts("Hello ${name}")
            [:praise, name]->IO.puts("#{name}, you're amazing")
            [:celebrate, name, age]->IO.puts("Here's to another #{age} years, #{name}")
        end
    loop
    end
end

pid = spawn(8Talker.loop/0)
send(pid, [:greet, "World"])
send(pid, ["praise", "Dewey"])
send(pid, [:celebrate, "Louie", 16])
sleep(1000)

spawn創(chuàng)建actor實(shí)例,并獲得進(jìn)程標(biāo)識(shí)符妖啥。

隊(duì)列式信箱

消息并不是直接發(fā)送到一個(gè)actor霉颠,而是發(fā)送到一個(gè)信箱。發(fā)送消息時(shí)不會(huì)被阻塞荆虱。actor按照信箱接收消息的順序來(lái)一次處理消息蒿偎,且僅在當(dāng)前消息處理完成后才會(huì)處理下一個(gè)消息朽们,因此我們只需要關(guān)心發(fā)消息時(shí)的并發(fā)問(wèn)題即可。

接收消息

通常actor會(huì)進(jìn)行無(wú)限循環(huán)诉位,通過(guò)recevice等待接收的消息骑脱,看上面的代碼中該函數(shù)通過(guò)遞歸調(diào)用實(shí)現(xiàn)無(wú)限循環(huán),那么可能有人會(huì)問(wèn)這樣不會(huì)造成棧溢出嗎苍糠?與許多函數(shù)式語(yǔ)言一樣叁丧,Elixir實(shí)現(xiàn)了尾調(diào)用的消除。為調(diào)用消除指的是如果函數(shù)在最后調(diào)用了自己岳瞭,那么遞歸調(diào)用將被替換成一個(gè)簡(jiǎn)單的跳轉(zhuǎn)拥娄。

為了徹底關(guān)閉一個(gè)actor,需要滿足兩個(gè)條件瞳筏。一個(gè)是需要告訴actor在完成消息處理之后關(guān)閉稚瘾;第二個(gè)是需要知道actor合適完成關(guān)閉。

def module Talker do
    def loop do
        recevie do
            [:shutdown] -> exit(:normal)
        end
    loop
    end
end

send(pid, [:shutdown])

有狀態(tài)的actor

雙向通信

actor模型沒有提供直接回復(fù)消息的機(jī)制姚炕,但我們可以自行解決:將發(fā)送進(jìn)程的標(biāo)識(shí)符包含在消息中摊欠。通過(guò)這個(gè)機(jī)制,消息的接受者可以回復(fù)消息柱宦。

5.3 第二天:錯(cuò)誤處理和容錯(cuò)性

并發(fā)很重要的一個(gè)特性是并發(fā)代碼具有容錯(cuò)性些椒。

在大多數(shù)語(yǔ)言中,唯一的處理方法是添加一些檢查參數(shù)的代碼捷沸,當(dāng)檢查到非法參數(shù)時(shí)報(bào)錯(cuò)摊沉。Elixir提供了另外一種方法--將錯(cuò)誤處理隔離到一個(gè)管理進(jìn)程中,這個(gè)方法看似簡(jiǎn)單痒给,確是一個(gè)很大的改進(jìn)说墨,使代碼更簡(jiǎn)潔、更具維護(hù)性苍柏,也更可靠尼斧。

錯(cuò)誤檢測(cè)

任其崩潰

防御式編程主要通過(guò)預(yù)言可能出現(xiàn)的缺陷來(lái)實(shí)現(xiàn)容錯(cuò)。使用actor模型的程序并不進(jìn)行防御式編程试吁。而是遵循了任其崩潰的哲學(xué)棺棵。

第六章 通信順序進(jìn)程

6.1 萬(wàn)物皆通信

通訊順序進(jìn)程(Communicating Sequential Process, CSP)模型,與actor類型熄捍,也是由獨(dú)立的烛恤,并發(fā)的執(zhí)行的實(shí)體所組成,實(shí)體之間也是通過(guò)發(fā)送消息進(jìn)行通信余耽。但兩種模型的最重要差別是:CSP模型不關(guān)注發(fā)送消息的實(shí)體缚柏,而是關(guān)注發(fā)送消息時(shí)使用的channel。

數(shù)據(jù)并行

7.1 隱藏在筆記本電腦中的超級(jí)計(jì)算機(jī)

圖形處理單元GPU碟贾,是一個(gè)強(qiáng)力的數(shù)據(jù)并行處理器币喧,其用于數(shù)學(xué)計(jì)算時(shí)性能超過(guò)CPU轨域,這種做法成為基于圖形處理器的通用計(jì)算(GPGPU編程)。

7.2 第一天:GPGPU編程

圖形處理與數(shù)據(jù)并行
3D游戲的一個(gè)場(chǎng)景是由無(wú)數(shù)個(gè)小三角形構(gòu)成的杀餐,每一個(gè)三角形都需要根據(jù)與視點(diǎn)相關(guān)的透視關(guān)系計(jì)算出其在屏幕上的位置干发,并進(jìn)行裁剪,處理光照史翘,修改紋理等枉长,這些操作每秒鐘需要進(jìn)行25次以上。

雖然需要處理的數(shù)據(jù)量是巨大的恶座,但其有一個(gè)非常好的特性:施加在數(shù)據(jù)上的操作都是相對(duì)簡(jiǎn)單的向量操作或矩陣操作搀暑。因此這種場(chǎng)景非常適合數(shù)據(jù)并行。

數(shù)據(jù)并行可以通過(guò)多種方法來(lái)實(shí)現(xiàn)跨琳,我們要學(xué)習(xí)其中的兩種:流水線和對(duì)ALU自点。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市脉让,隨后出現(xiàn)的幾起案子桂敛,更是在濱河造成了極大的恐慌,老刑警劉巖溅潜,帶你破解...
    沈念sama閱讀 219,589評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件术唬,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡滚澜,警方通過(guò)查閱死者的電腦和手機(jī)粗仓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)设捐,“玉大人借浊,你說(shuō)我怎么就攤上這事÷苷校” “怎么了蚂斤?”我有些...
    開封第一講書人閱讀 165,933評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)槐沼。 經(jīng)常有香客問(wèn)我曙蒸,道長(zhǎng),這世上最難降的妖魔是什么岗钩? 我笑而不...
    開封第一講書人閱讀 58,976評(píng)論 1 295
  • 正文 為了忘掉前任纽窟,我火速辦了婚禮,結(jié)果婚禮上兼吓,老公的妹妹穿的比我還像新娘臂港。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評(píng)論 6 393
  • 文/花漫 我一把揭開白布趋艘。 她就那樣靜靜地躺著,像睡著了一般凶朗。 火紅的嫁衣襯著肌膚如雪瓷胧。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,775評(píng)論 1 307
  • 那天棚愤,我揣著相機(jī)與錄音搓萧,去河邊找鬼。 笑死宛畦,一個(gè)胖子當(dāng)著我的面吹牛瘸洛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播次和,決...
    沈念sama閱讀 40,474評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼反肋,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了踏施?” 一聲冷哼從身側(cè)響起石蔗,我...
    開封第一講書人閱讀 39,359評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎畅形,沒想到半個(gè)月后养距,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,854評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡日熬,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評(píng)論 3 338
  • 正文 我和宋清朗相戀三年棍厌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片竖席。...
    茶點(diǎn)故事閱讀 40,146評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡耘纱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出怕敬,到底是詐尸還是另有隱情揣炕,我是刑警寧澤,帶...
    沈念sama閱讀 35,826評(píng)論 5 346
  • 正文 年R本政府宣布东跪,位于F島的核電站畸陡,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏虽填。R本人自食惡果不足惜丁恭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望斋日。 院中可真熱鬧牲览,春花似錦、人聲如沸恶守。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至庸毫,卻和暖如春仔拟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背飒赃。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工利花, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人载佳。 一個(gè)月前我還...
    沈念sama閱讀 48,420評(píng)論 3 373
  • 正文 我出身青樓炒事,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親蔫慧。 傳聞我的和親對(duì)象是個(gè)殘疾皇子挠乳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評(píng)論 2 356

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

  • 持久化 當(dāng)我們?cè)诩合到y(tǒng)中,一臺(tái)機(jī)器向另一臺(tái)機(jī)器發(fā)送一段數(shù)據(jù)姑躲,負(fù)責(zé)接收的機(jī)器在接收數(shù)據(jù)前突然宕機(jī)欲侮,就會(huì)造成數(shù)據(jù)丟失...
    mango_knight閱讀 4,539評(píng)論 0 4
  • 本文章翻譯自 https://blog.codeship.com/comparing-elixir-go 譯者:關(guān)...
    Shawn_xiaoyu閱讀 8,772評(píng)論 3 26
  • 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,342評(píng)論 2 6
  • 拎一把云的噴壺 在你到來(lái)之前 浸濕這條路的路面 以免的你因這夏日飛揚(yáng)的灰層 迷了雙眼 又或者 就讓那雨做的云一直噴...
    鐵小鍬閱讀 265評(píng)論 1 1
  • 今日和何先生定了兩個(gè)小時(shí)的場(chǎng)地橄仍,打了一場(chǎng)酣暢淋漓的羽毛球韧涨。 一開始,我打得很差侮繁,不停地?fù)烨蚵侵唷0雮€(gè)小時(shí)過(guò)去了,消耗了...
    小優(yōu)老師愛生活閱讀 624評(píng)論 3 8