出版時間:2012-8 出版社:人民郵電出版社 作者:[美] Martin Logan,[美] Eric Merritt,[瑞典] Richard Carlsson 頁數(shù):333 字?jǐn)?shù):526000 譯者:連 城
Tag標(biāo)簽:無
前言
本書試圖提煉出成就一名專業(yè)Erlang程序員所需的最關(guān)鍵的知識,借此我們才能讓這門高效的語言發(fā)揮出其最大的潛力。Erlang/OTP功能強(qiáng)大,但直到目前為止,對初學(xué)者來說,通過研讀OTP文檔來自學(xué)OTP框架仍然是件令人望而生畏的事情(這些文檔探究了很多細(xì)節(jié),卻缺乏全局觀)。 本書三位作者長期從事Erlang相關(guān)工作,但各自的發(fā)展軌跡卻很不一樣?!? Martin:“我是在自己第一份‘真正’的工作中接觸到Erlang的。此前我一直從事C和C++開發(fā),也有意思得很。我的第一任老板Hal Snyder甚至在20世紀(jì)90年代便對多線程深惡痛絕,后來邂逅了Erlang。我那時還只是個實(shí)習(xí)生,于是他給了我一個要用Erlang完成的項(xiàng)目。原因嘛,嗯,無非是我的工錢低,即便我搞砸了,公司在這樁買賣上的損失也就不過70美元。最后我并沒搞砸,我自己寫了一個1000行的監(jiān)督進(jìn)程,代碼不好看,因?yàn)槟菚r候我壓根兒不知道OTP是什么東西,手邊當(dāng)然也不會有相關(guān)的書。在這個過程中,我愛上了這種‘靠譜’的開發(fā)后端系統(tǒng)的方法,也愛上了Erlang。Erlang給了我洞悉未來的機(jī)會:我所寫的復(fù)雜分布式系統(tǒng),所用的高級算法,都是我那些使喚著命令式語言的同事們所夢寐以求的,不花上兩年工夫碼上一百萬行代碼他們壓根兒實(shí)現(xiàn)不出來。讀了數(shù)千頁文檔,寫了數(shù)萬行代碼之后,我依然鐘情于它。一路走來,我遇到了許多杰出的人物,能與其中的兩位共同撰寫本書令我激動不已。2004年我在ACM會議上發(fā)言時遇到了Richard,四年后我又遇到了Eric,并和他一同創(chuàng)建了Erlware--一個仍在蓬勃發(fā)展中的項(xiàng)目。多年來,Erlang在我的職業(yè)生涯和個人生活中一直扮演著重要的角色,今后也仍會如此。” Eric:“我研究Erlang完全是無心插柳。我曾想寫一款大規(guī)模多人游戲。然而我明白,僅憑一人之力,即便是才華橫溢,也干不完所有圖形處理的活兒。于是我決定集中精力主攻游戲邏輯部分,覺得借助于合適的工具和語言我應(yīng)該能解決這部分問題。在我的設(shè)計(jì)中,我喜歡在游戲中設(shè)立多個代理對象,每個代理對象都能隨時間自主學(xué)習(xí)并獨(dú)立而并發(fā)地行動。那時我能想到的唯一可行的辦法,就是把每個代理對象都建模為某種并發(fā)的東西,但當(dāng)時我還不知道這個東西是什么。我所掌握的語言沒法讓一個開發(fā)者單槍匹馬拿下這么一款游戲。于是,我開始考察各種語言,前前后后一共花了大概五年時間,作了一些深入的研究。我很早就見識過Erlang,雖然很喜歡它的并發(fā)特性,但實(shí)在受不了它的語法和函數(shù)式特質(zhì)。直到考察了很多編程語言之后,我才重新開始欣賞Erlang并用它編寫代碼。那款游戲我一直也沒能寫成,但我確信選擇Erlang沒有錯,經(jīng)過深入的研究和剖析,我發(fā)現(xiàn)這門語言在許多方面都大有用武之地。這大概是2000年或2001年的事情了。后續(xù)幾年間,我又自學(xué)了OTP。后來,在2005的時候,我在發(fā)布了Sinan的第一版,還認(rèn)識了Martin Logan,并和他一起創(chuàng)辦了Erlware。2008年,我搬到了芝加哥,開始寫書并盡心打理Erlware項(xiàng)目?!? Richard:“我大概是在1995年前后接觸Erlang的,那時我正在烏普薩拉大學(xué)為計(jì)算機(jī)科學(xué)碩士論文選題。這引導(dǎo)我后來成為高性能Erlang研究組的一名博士研究生,就Erlang編譯器和運(yùn)行時系統(tǒng)做了若干年的研究。我在瑞典和美國的會議上結(jié)識了Martin Logan和Eric Merritt,他們對Erlang的熱情令我印象深刻,盡管那時候Erlang還是一門鮮為人知的語言--尤其是在美國。在攻讀博士學(xué)位期間,我搞了幾個業(yè)余項(xiàng)目,其中語法工具庫和EDoc應(yīng)用都源自我在編譯器方面的研究成果,而EUnit原本是為了檢查我的學(xué)生們的并發(fā)編程作業(yè)是否符合規(guī)范而設(shè)計(jì)的。走出學(xué)術(shù)界之后,我做了幾年和Erlang無關(guān)的工作,基本上都是在用Python、Ruby和C++寫程序。不過最近,我加盟了瑞典最成功的一家創(chuàng)業(yè)公司,再次全職投入Erlang,目前正投身于高速發(fā)展的高可用性支付系統(tǒng)領(lǐng)域。” 我們?nèi)伺墓餐慕?jīng)驗(yàn)中提煉出盡可能多的內(nèi)容,以便讓你在邁向大師級Erlang程序員的道路上少走彎路;我們也希望能借助本書,最終讓OTP框架成為每個Erlang程序員--而不是少數(shù)能將手冊翻爛的人--都能掌握的東西。
內(nèi)容概要
《Erlang/OTP并發(fā)編程實(shí)戰(zhàn)》側(cè)重生產(chǎn)環(huán)境下的Erlang開發(fā),主要講解如何構(gòu)建穩(wěn)定、版本控制良好、可維護(hù)的產(chǎn)品級代碼,凝聚了三位Erlang大師多年的實(shí)戰(zhàn)經(jīng)驗(yàn)。
《Erlang/OTP并發(fā)編程實(shí)戰(zhàn)》主要分為三大部分:第一部分講解Erlang編程及OTP基礎(chǔ);第二部分講解如何在實(shí)際開發(fā)中逐一添加OTP高級特性,從而完善應(yīng)用,作者通過貫穿本書的主項(xiàng)目——加速Web訪問的分布式緩存應(yīng)用,深入淺出地闡明了實(shí)踐中的各種技巧;第三部分討論如何將代碼與其他系統(tǒng)和用戶集成,以及如何進(jìn)行性能調(diào)優(yōu)。
《Erlang/OTP并發(fā)編程實(shí)戰(zhàn)》面向Erlang程序員,以及對Erlang/OTP感興趣的開發(fā)人員。
作者簡介
Martin Logan 從1999年開始活躍于Erlang社區(qū),后來全職從事Erlang研發(fā)。目前任職于全球最大的在線旅游公司Orbitz Worldwide,為基于大規(guī)模分布式服務(wù)的基礎(chǔ)設(shè)施開發(fā)解決方案。Erlware聯(lián)合創(chuàng)始人,核心開發(fā)人員,Erlang/OTP軟件包管理系統(tǒng)Faxien的主要開發(fā)者。
Eric Merritt 專注并發(fā)編程和分布式系統(tǒng)。曾任職于Amazon.com,現(xiàn)為eCD Market軟件工程師。Erlware聯(lián)合創(chuàng)始人,Erlang芝加哥用戶組核心成員。Erlware團(tuán)隊(duì)開源產(chǎn)品核心開發(fā)人員,Erlang/OTP構(gòu)建系統(tǒng)Sinan的主要開發(fā)者。
Richard Carlsson 瑞典烏普薩拉大學(xué)高性能Erlang計(jì)劃(HiPE)早期成員,研究Erlang技術(shù)達(dá)17年,曾為標(biāo)準(zhǔn)庫、Erlang編譯器、運(yùn)行時系統(tǒng)和Erlang語言本身都作出過不少貢獻(xiàn)。此外,他還是Erlang文檔系統(tǒng)EDoc和單元測試框架EUnit的創(chuàng)建者。目前加入了Kreditor,致力于高可用性支付系統(tǒng)的Erlang開發(fā)。
書籍目錄
目 錄
第一部分 Erlang起步:OTP基礎(chǔ)
第1章 Erlang/OTP平臺 2
1.1 基于進(jìn)程的并發(fā)編程 3
1.1.1 理解并發(fā) 3
1.1.2 Erlang的進(jìn)程模型 4
1.1.3 4種進(jìn)程通信范式 5
1.1.4 用Erlang進(jìn)程編程 8
1.2 Erlang的容錯架構(gòu) 10
1.2.1 進(jìn)程鏈接如何工作 10
1.2.2 監(jiān)督與退出信號捕捉 10
1.2.3 進(jìn)程的分層容錯 12
1.3 分布式Erlang 13
1.4 Erlang運(yùn)行時系統(tǒng)和虛擬機(jī) 13
1.4.1 調(diào)度器 14
1.4.2 I/O與調(diào)度 15
1.4.3 進(jìn)程隔離與垃圾回收器 15
1.5 函數(shù)式編程:Erlang的處世之道 16
1.6 小結(jié) 16
第2章 Erlang語言精要 18
2.1 Erlang shell 19
2.1.1 啟動shell 19
2.1.2 輸入表達(dá)式 20
2.1.3 shell函數(shù) 21
2.1.4 退出shell 21
2.1.5 任務(wù)控制基礎(chǔ) 22
2.2 Erlang的數(shù)據(jù)類型 23
2.2.1 數(shù)值與算術(shù)運(yùn)算 24
2.2.2 二進(jìn)制串與位串 25
2.2.3 原子 26
2.2.4 元組 27
2.2.5 列表 27
2.2.6 字符串 28
2.2.7 pid、端口和引用 29
2.2.8 將函數(shù)視作數(shù)據(jù):fun函數(shù) 30
2.2.9 項(xiàng)式的比較 30
2.2.10 解讀列表 31
2.3 模塊和函數(shù) 33
2.3.1 調(diào)用其他模塊中的函數(shù)(遠(yuǎn)程調(diào)用) 33
2.3.2 不同元數(shù)的函數(shù) 34
2.3.3 內(nèi)置函數(shù)和標(biāo)準(zhǔn)庫模塊 34
2.3.4 創(chuàng)建模塊 35
2.3.5 模塊的編譯和加載 36
2.3.6 獨(dú)立編譯器erlc 37
2.3.7 已編譯模塊與在shell中求值 37
2.4 變量與模式匹配 38
2.4.1 變量的語法 39
2.4.2 單次賦值 39
2.4.3 模式匹配:加強(qiáng)版的賦值 41
2.4.4 解讀模式 42
2.5 函數(shù)與子句 44
2.5.1 帶副作用的函數(shù):文本打印 44
2.5.2 用模式匹配在多個子句中進(jìn)行選擇 45
2.5.3 保護(hù)式 46
2.5.4 模式、子句和變量作用域 47
2.6 Case和if表達(dá)式 48
2.6.1 Erlang的布爾型if-then-else分支選擇 48
2.6.2 If表達(dá)式 49
2.7 fun函數(shù) 49
2.7.1 作為現(xiàn)有函數(shù)別名的fun函數(shù) 49
2.7.2 匿名fun函數(shù) 50
2.8 異常與try/catch 52
2.8.1 拋出(觸發(fā))異?!?2
2.8.2 運(yùn)用try...catch 53
2.8.3 try...of...catch 53
2.8.4 after 54
2.8.5 獲取棧軌跡 54
2.8.6 重拋異常 55
2.8.7 傳統(tǒng)的catch 55
2.9 列表速構(gòu) 56
2.9.1 列表速構(gòu)記法 56
2.9.2 映射、過濾和模式匹配 56
2.10 比特位語法與位串速構(gòu) 57
2.10.1 構(gòu)造位串 57
2.10.2 比特位語法中的模式匹配 58
2.10.3 位串速構(gòu) 59
2.11 記錄語法 59
2.11.1 記錄聲明 60
2.11.2 創(chuàng)建記錄 60
2.11.3 記錄的字段以及模式匹配 60
2.11.4 更新記錄字段 60
2.11.5 記錄聲明應(yīng)該放在哪兒 61
2.12 預(yù)處理與文件包含 61
2.12.1 宏的定義和使用 61
2.12.2 文件包含 62
2.12.3 條件編譯 63
2.13 進(jìn)程 64
2.13.1 操縱進(jìn)程 64
2.13.2 消息接收與選擇性接收 65
2.13.3 注冊進(jìn)程 66
2.13.4 消息投遞與信號 67
2.13.5 進(jìn)程字典 67
2.14 ETS表 68
2.14.1 為何ETS表被設(shè)計(jì)成這樣 68
2.14.2 ETS表的基本用法 68
2.15 以遞歸代替循環(huán) 69
2.15.1 從迭代到遞歸 69
2.15.2 理解尾遞歸 71
2.15.3 累加器參數(shù) 72
2.15.4 談?wù)勑省?2
2.15.5 編寫遞歸函數(shù)的竅門 73
2.16 Erlang編程資源 78
2.16.1 圖書 78
2.16.2 在線資料 79
2.17 小結(jié) 79
第3章 開發(fā)基于TCP的RPC服務(wù) 80
3.1 你所創(chuàng)建的是什么 81
3.1.1 基礎(chǔ)知識提醒 82
3.1.2 行為模式基礎(chǔ) 82
3.2 實(shí)現(xiàn)RPC服務(wù)器 85
3.2.1 行為模式實(shí)現(xiàn)模塊的典型布局 85
3.2.2 模塊首部 85
3.2.3 API段 88
3.2.4 回調(diào)函數(shù)段 92
3.3 運(yùn)行RPC服務(wù)器 98
3.4 淺談測試 99
3.5 小結(jié) 100
第4章 OTP應(yīng)用與監(jiān)督機(jī)制 101
4.1 OTP應(yīng)用 101
4.1.1 OTP應(yīng)用的組織形式 102
4.1.2 為應(yīng)用添加元數(shù)據(jù) 103
4.1.3 應(yīng)用行為模式 104
4.1.4 應(yīng)用結(jié)構(gòu)小結(jié) 105
4.2 用監(jiān)督者實(shí)現(xiàn)容錯 105
4.2.1 實(shí)現(xiàn)監(jiān)督者 106
4.2.2 監(jiān)督者重啟策略 107
4.2.3 編寫子進(jìn)程規(guī)范 108
4.3 啟動應(yīng)用 109
4.4 生成EDoc文檔 110
4.5 小結(jié) 110
第5章 主要圖形化監(jiān)測工具的使用 112
5.1 Appmon 112
5.1.1 Appmon GUI 112
5.1.2 WebTool版Appmon 115
5.2 Pman 116
5.3 調(diào)試器 118
5.4 表查看器TV 121
5.5 工具欄 123
5.6 小結(jié) 123
第二部分 構(gòu)建生產(chǎn)系統(tǒng)
第6章 打造一套緩存系統(tǒng) 126
6.1 故事背景 126
6.2 緩存的設(shè)計(jì) 127
6.3 創(chuàng)建OTP應(yīng)用的基本骨架 130
6.3.1 應(yīng)用目錄結(jié)構(gòu)的布局 130
6.3.2 創(chuàng)建應(yīng)用元數(shù)據(jù) 130
6.3.3 實(shí)現(xiàn)應(yīng)用行為模式 131
6.3.4 實(shí)現(xiàn)監(jiān)督者 131
6.4 從應(yīng)用骨架到五臟俱全的緩存 133
6.4.1 編寫sc_element進(jìn)程 134
6.4.2 實(shí)現(xiàn)sc_store模塊 138
6.4.3 打造應(yīng)用層API模塊 142
6.5 小結(jié) 144
第7章 Erlang/OTP中的日志與事件處理 145
7.1 Erlang/OTP中的日志 146
7.1.1 日志概述 146
7.1.2 Erlang/OTP內(nèi)置的日志設(shè)施 147
7.1.3 標(biāo)準(zhǔn)日志函數(shù) 147
7.1.4 SASL與崩潰報(bào)告 149
7.2 用gen_event編寫自定義事件處理器 153
7.2.1 gen_event行為模式簡介 153
7.2.2 事件處理器示例 154
7.2.3 處理錯誤事件 155
7.3 為Simple Cache添加自定義事件流 157
7.3.1 事件流API 157
7.3.2 將處理器整合進(jìn)Simple Cache 159
7.3.3 訂閱自定義事件流 161
7.4 小結(jié) 162
第8章 分布式Erlang/OTP簡介 163
8.1 Erlang分布式基礎(chǔ) 163
8.1.1 復(fù)制式進(jìn)程間通信 164
8.1.2 位置透明性 165
8.2 節(jié)點(diǎn)與集群 166
8.2.1 節(jié)點(diǎn)的啟動 166
8.2.2 節(jié)點(diǎn)的互聯(lián) 167
8.2.3 Erlang節(jié)點(diǎn)如何定位其他節(jié)點(diǎn)并與之建立通信 169
8.2.4 magic cookie安全系統(tǒng) 170
8.2.5 互聯(lián)節(jié)點(diǎn)間的消息傳遞 171
8.2.6 使用遠(yuǎn)程shell 173
8.3 資源探測攻略 175
8.3.1 術(shù)語 175
8.3.2 算法 176
8.3.3 實(shí)現(xiàn)資源探測應(yīng)用 177
8.4 小結(jié) 182
第9章 用Mnesia為cache增加分布式支持 183
9.1 分布式緩存 184
9.1.1 選取通信策略 184
9.1.2 同步緩存和異步緩存 186
9.1.3 分布式表 188
9.2 用Mnesia實(shí)現(xiàn)分布式數(shù)據(jù)存儲 189
9.2.1 建立項(xiàng)目數(shù)據(jù)庫 189
9.2.2 初始化數(shù)據(jù)庫 191
9.2.3 建表 192
9.2.4 向表中錄入數(shù)據(jù) 195
9.2.5 執(zhí)行基本查詢 197
9.3 基于Mnesia的分布式緩存 199
9.3.1 用Mnesia取代ETS 199
9.3.2 讓緩存識別出其他節(jié)點(diǎn) 202
9.3.3 用資源探測定位其他緩存實(shí)例 205
9.3.4 動態(tài)復(fù)制Mnesia表 206
9.4 小結(jié) 209
第10章 打包、服務(wù)和部署 210
10.1 從系統(tǒng)的角度看應(yīng)用 210
10.1.1 結(jié)構(gòu) 211
10.1.2 元數(shù)據(jù) 211
10.1.3 系統(tǒng)如何管理運(yùn)行中的應(yīng)用 212
10.2 制作發(fā)布鏡像 213
10.2.1 發(fā)布鏡像 213
10.2.2 準(zhǔn)備發(fā)布代碼 214
10.2.3 發(fā)布鏡像的元數(shù)據(jù)文件 214
10.2.4 腳本與啟動文件 216
10.2.5 系統(tǒng)配置 217
10.2.6 啟動目標(biāo)系統(tǒng) 218
10.3 發(fā)布鏡像打包 219
10.3.1 創(chuàng)建發(fā)布鏡像包 219
10.3.2 發(fā)布鏡像包的內(nèi)容 220
10.3.3 定制發(fā)布鏡像包 222
10.4 安裝發(fā)布鏡像 223
10.5 小結(jié) 223
第三部分 集成與完善
第11章 為緩存添加HTTP接口 226
11.1 實(shí)現(xiàn)TCP服務(wù)器 226
11.1.1 高效TCP服務(wù)器的設(shè)計(jì)模式 227
11.1.2 搭建tcp_interface應(yīng)用的骨架 228
11.1.3 填充TCP服務(wù)器的實(shí)現(xiàn)邏輯 228
11.1.4 簡單文本協(xié)議 231
11.1.5 文本接口實(shí)現(xiàn) 232
11.2 打造一套全新的Web接口 234
11.2.1 HTTP簡介 234
11.2.2 實(shí)現(xiàn)一套通用的Web服務(wù)器行為模式 237
11.2.3 初識REST 248
11.2.4 用gen_web_server實(shí)現(xiàn)REST式協(xié)議 249
11.3 小結(jié) 252
第12章 用端口和NIF集成外圍代碼 253
12.1 端口和NIF 254
12.1.1 普通端口 255
12.1.2 鏈入式端口驅(qū)動 256
12.1.3 原生函數(shù)(NIF) 257
12.2 用端口來集成解析器 257
12.2.1 Erlang方面的端口 257
12.2.2 C方面的端口 260
12.2.3 編譯運(yùn)行 271
12.3 開發(fā)鏈入式驅(qū)動 272
12.3.1 初識鏈入式驅(qū)動 273
12.3.2 驅(qū)動的C語言部分 274
12.3.3 編譯驅(qū)動代碼 278
12.3.4 驅(qū)動的Erlang部分 279
12.4 將解析器實(shí)現(xiàn)為NIF 280
12.4.1 NIF的Erlang部分 280
12.4.2 NIF的C代碼部分 281
12.4.3 編譯與運(yùn)行代碼 287
12.5 小結(jié) 288
第13章 用Jinterface實(shí)現(xiàn)Erlang和Java間的通信 289
13.1 利用Jinterface在Erlang中集成Java 290
13.1.1 OtpNode類 290
13.1.2 OtpMbox類 291
13.1.3 Erlang數(shù)據(jù)結(jié)構(gòu)的Java映射 291
13.1.4 示例:Java中的消息處理 292
13.1.5 在Erlang中與Java節(jié)點(diǎn)通信 294
13.2 安裝和配置HBase 296
13.2.1 下載和安裝 296
13.2.2 配置HBase 296
13.3 為Simple Cache和HBase牽線搭橋 297
13.3.1 Erlang方面:sc_hbase.erl 298
13.3.2 HBaseConnector類 299
13.3.3 Java中的消息處理 301
13.3.4 HBaseTask類 304
13.4 在Simple Cache中整合HBase 306
13.4.1 查詢 306
13.4.2 插入 307
13.4.3 刪除 307
13.5 運(yùn)行集成系統(tǒng) 308
13.6 小結(jié) 310
第14章 優(yōu)化與性能 311
14.1 如何進(jìn)行性能調(diào)優(yōu) 312
14.1.1 設(shè)定性能目標(biāo) 312
14.1.2 設(shè)定基線 313
14.1.3 系統(tǒng)性能分析 313
14.1.4 確定需要解決的問題 313
14.1.5 測定優(yōu)化成果 313
14.2 Erlang代碼性能分析 314
14.2.1 用cprof計(jì)算調(diào)用次數(shù) 314
14.2.2 用fprof測定執(zhí)行時間 316
14.3 Erlang編程語言的缺陷 320
14.3.1 基本數(shù)據(jù)類型的性能特點(diǎn) 321
14.3.2 內(nèi)置函數(shù)和運(yùn)算符的性能 324
14.3.3 函數(shù) 325
14.3.4 進(jìn)程 327
14.4 小結(jié) 329
附錄A 安裝Erlang 330
附錄B 列表與引用透明性 332
章節(jié)摘錄
版權(quán)頁: 插圖: 1.4.1 調(diào)度器 經(jīng)過多年的演進(jìn),ERTS的進(jìn)程調(diào)度器提供了其他平臺無法比擬的靈活性。它最初的設(shè)計(jì)目標(biāo)是在單CPU上并發(fā)運(yùn)行輕量級Erlang進(jìn)程,而不用關(guān)心底層用的是什么操作系統(tǒng)。ERTS運(yùn)行的時候通常就是單個操作系統(tǒng)進(jìn)程(在操作系統(tǒng)的進(jìn)程列表中一般名為beam或werl)。這個進(jìn)程中,就跑著管理所有Erlang進(jìn)程的調(diào)度器。 隨著線程在大多數(shù)操作系統(tǒng)中的普及,ERTS也有所變化,開始將I/O系統(tǒng)這類東西從運(yùn)行Erlang進(jìn)程的線程中拿出來,放到獨(dú)立的線程中去,但完成主體工作的線程仍然只有一個。如果你用的是多核系統(tǒng),就必須在同一臺機(jī)器上運(yùn)行多個ERTS實(shí)例。不過從2006年5月起,Erlang/OTP第11版中增加了對稱多處理器(SMP)支持。這是一項(xiàng)重大突破,令Erlang運(yùn)行時系統(tǒng)可以在內(nèi)部使用不止一個進(jìn)程調(diào)度器,每個占用一個獨(dú)立的操作系統(tǒng)線程。 這意味著現(xiàn)在Erlang進(jìn)程可以以n:m的方式映射到操作系統(tǒng)線程。每個調(diào)度器處理一個進(jìn)程池??刹⑿羞\(yùn)行的Erlang進(jìn)程最多能有m個(每個調(diào)度器線程執(zhí)行一個),但同一池內(nèi)的進(jìn)程仍像之前所有進(jìn)程共用一個調(diào)度器那樣分時運(yùn)行。在此基礎(chǔ)之上,進(jìn)程可以在進(jìn)程池之間遷移以便維 持可用調(diào)度器上的負(fù)載均衡。在最新的Erlang/OTP發(fā)布版中,甚至可以根據(jù)機(jī)器上CPU的拓?fù)淝?況將進(jìn)程綁定到特定的調(diào)度器上,從而更好地利用硬件的緩存架構(gòu)。這意味著,大多數(shù)時候,作為一名Erlang程序員你不用擔(dān)心手頭有多少CPU或有多少個核:你只要中規(guī)中矩地寫程序,并盡量將程序切分為尺寸適中的并行任務(wù)就好,負(fù)載均衡之類的事情就讓Erlang運(yùn)行時系統(tǒng)去操心吧。不管是單核還是128核——都一樣,只會更快。 Erlang新手常犯的一個錯誤就是過分依賴時序,這往往導(dǎo)致那些在他們的筆記本或工作站上運(yùn)行良好的程序一遷移到多核服務(wù)器上就出錯,因?yàn)樵诙嗪朔?wù)器上時序的不確定性要大得多。要發(fā)現(xiàn)這類問題,只能借助測試。好在現(xiàn)在的筆記本基本上都至少是雙核的了,這類錯誤也可以被盡早發(fā)現(xiàn)。 Erlang的調(diào)度器還涉及運(yùn)行時系統(tǒng)的另一個重要特性:I/O子系統(tǒng)。這正是我們的下一個主題。 1.4.2 I/O與調(diào)度 很多并發(fā)語言都有的一個毛病就是它們沒怎么拿I/O當(dāng)回事兒。單個進(jìn)程進(jìn)行I/O時,它們幾乎都存在整個系統(tǒng)或大半系統(tǒng)阻塞的問題。這真是既惱人又沒有必要,尤其是Erlang早在二十年前就已經(jīng)解決了這個問題。在前一節(jié),我們曾討論過Erlang的進(jìn)程調(diào)度器。除了處理進(jìn)程調(diào)度,調(diào)度器還替系統(tǒng)優(yōu)雅地處理了I/O問題。在系統(tǒng)的最底層,Erlang以事件驅(qū)動的方式處理所有I/O,當(dāng)數(shù)據(jù)進(jìn)出系統(tǒng)時,程序可以以非阻塞方式完成數(shù)據(jù)處理。這降低了連接建立和斷開的頻次,還避免了OS層面上的加鎖開銷和上下文切換。 這是一種高效的I/O處理方法??上?,程序員往往難以分析和理解這種技術(shù),這也是為什么只有在明確要求高可靠性和低延遲的系統(tǒng)中才能見到這種技術(shù)。早在2001年,Dan Kegel就在他的論文The C10K Problem中描述過這個問題,雖然現(xiàn)在已經(jīng)略顯過時,但這篇文章仍然很值得一讀。它針對這個問題及可能的解決方案給出了良好的綜述。這些方案實(shí)現(xiàn)起來全都既復(fù)雜又痛苦,這正是Erlang運(yùn)行時系統(tǒng)替你包辦這些問題的原因。Erlang在進(jìn)程調(diào)度器中整合了基于事件的I/O系統(tǒng)。事實(shí)上,你一點(diǎn)兒都不用操心就能享受一切便利。這讓用Erlang/OTP構(gòu)建高可靠性系統(tǒng)變得輕松了很多。 我們要講解的最后一個ERTs特性就是內(nèi)存管理。它對進(jìn)程所起的作用超出你的想象。 1.4.3 進(jìn)程隔離與垃圾回收器 如你所想,Erlang跟Java等大部分現(xiàn)代語言一樣,會自動管理內(nèi)存。這兒沒有顯式的釋放操作。相反,垃圾回收器會定期搜尋和回收不再使用的內(nèi)存。垃圾回收(GC)算法是一片廣袤而復(fù)雜的研究領(lǐng)域,我們無法在這兒給出詳盡的闡述;不過針對那些對此有一定了解又心懷好奇的讀者,可以告訴你Erlang當(dāng)前使用的是一個簡單明了的分代復(fù)制式垃圾回收器。
編輯推薦
《Erlang/OTP并發(fā)編程實(shí)戰(zhàn)》講述了如果將Erlang語言看成才華橫溢的鋼琴家,那么OTP平臺就是一架能讓鋼琴家把才能發(fā)揮得淋漓盡致的鋼琴。《Erlang/OTP并發(fā)編程實(shí)戰(zhàn)》除了全面介紹Erlang語言和OTP平臺的基礎(chǔ)知識外,還通過一系列實(shí)用案例引領(lǐng)你深入了解OTP的高級特性,一步步構(gòu)建一個大型生產(chǎn)系統(tǒng)。并加以優(yōu)化和完善。三位作者在Erlang領(lǐng)域擁有極其豐富的實(shí)戰(zhàn)經(jīng)驗(yàn),細(xì)致入微地剖析了OTP開發(fā)與部署的全過程。要想真刀真槍地上戰(zhàn)場?!禘rlang/OTP并發(fā)編程實(shí)戰(zhàn)》才是你明智的選擇!
名人推薦
“驚艷!不管是對于初學(xué)者還是Erlang高手,本書絕對都是不容錯過的好書。” ——Amazon.com書評 “多核處理器和并發(fā)編程是將來的重頭戲。ErIang在下一代編程語言中可謂獨(dú)領(lǐng)風(fēng)騷!” ——DZone書評 “Erlang開發(fā)者必備兩本書,一本是ErIang之父Joe Arrrlstrong的《Erlang程序設(shè)計(jì)》,另一本就是本書——務(wù)實(shí)、高效又不失幽默風(fēng)趣的好書??!” ——slashdot.org書評
圖書封面
圖書標(biāo)簽Tags
無
評論、評分、閱讀與下載
Erlang/OTP并發(fā)編程實(shí)戰(zhàn) PDF格式下載