內容簡介
圖書內容
編寫和運行併發程式
編寫高性能、高擴展性和高彈性程式的策略
選擇合適的硬體以支援併發
非同步通信在併發程式設計中的應用
作者簡介
Kirill Bobrov是一名資深軟體工程師,精通高負載應用的設計與開發,對資料工程充滿熱情。
目錄
第一篇 章 魚交響樂團:併發交響曲1
第1章 併發入門3
1 1 為什麼併發如此重要4
1 2 併發的層級8
1 3 本書內容10
1 4 本章 小結11
第2章 串列執行和並存執行13
2 1 程式概念14
2 2 串列執行15
2 3 順序計算16
2 4 並存執行18
2 5 平行計算的要求20
2 6 平行計算22
2 7 阿姆達爾定律27
2 8 古斯塔夫森定律31
2 9 併發與並行31
2 10 本章 小結33
第3章 計算機工作原理35
3 1 處理器36
3 2 運行時系統39
3 3 電腦系統設計40
3 4 併發的硬體層級41
3 5 本章 小結45
第4章 創建併發組件47
4 1 併發程式設計步驟48
4 2 進程48
4 3 執行緒52
4 4 本章 小結58
第5章 進程間通信59
5 1 通信類型60
5 2 執行緒池模式70
5 3 再次破解密碼73
5 4 本章 小結75
第二篇 併發的章 魚觸手:多工、分解、同步77
第6章 多工79
6 1 CPU密集型和I/O密集型應用80
6 2 多工需求82
6 3 多工概覽85
6 4 多工環境90
6 5 本章 小結93
第7章 分解95
7 1 依賴分析96
7 2 任務分解97
7 3 任務分解:流水線模式98
7 4 資料分解103
7 5 顆粒度111
7 6 本章 小結113
第8章 併發難題:競爭條件和同步115
8 1 資源分享116
8 2 競爭條件117
8 3 同步121
8 4 本章 小結128
第9章 處理併發問題:鎖死和饑餓131
9 1 哲學家就餐問題132
9 2 鎖死134
9 3 活鎖139
9 4 饑餓141
9 5 同步設計143
9 6 再談併發149
9 7 本章 小結150
第三篇 非同步章 魚:使用併發原理烹飪比薩151
第10章 非阻塞式I/O153
10 1 世界是分散式的154
10 2 用戶端-伺服器模型154
10 3 比薩點餐服務156
10 4 阻塞式I/O163
10 5 非阻塞式I/O165
10 6 本章 小結168
第11章 事件驅動併發171
11 1 事件172
11 2 回檔173
11 3 事件迴圈173
11 4 I/O多工176
11 5 事件驅動的比薩伺服器177
11 6 反應器模式179
11 7 消息傳遞中的同步181
11 8 I/O模型183
11 9 本章 小結184
第12章 非同步通信185
12 1 對非同步的需求186
12 2 非同步程序呼叫186
12 3 協同多工處理187
12 4 Future對象192
12 5 協同比薩伺服器196
12 6 非同步比薩店201
12 7 非同步模型結論207
12 8 本章 小結208
第13章 創建併發應用209
13 1 併發概念210
13 2 Foster方法論211
13 3 矩陣乘法212
13 4 分散式詞頻統計220
13 5 本章 小結231
結語233
前言/序言
在深入探討併發之前,我想先表達我的感激之情,沒有這些傑出人士的支持,本書不可能出版。有人將寫書比作跑馬拉松,但我認為寫書的體驗更像一場狂野的過山車之旅,幸運的是,有這些夥伴的陪伴!
首先,我要向我的妻子葉卡捷琳娜•克裡弗茨(Ekaterina Krivets)表達我最深的感激之情,她為本書貢獻了所有令人驚歎的插圖。
其次,我的團隊也一直陪伴著我,並給予我支持。特別感謝基裡尼娜•亞利雪娃(Kristina Ialysheva)、米哈伊爾•波爾托拉茨基(Mikhail Poltoratskii)、塔蒂娜•波羅丁娜(Tatiana Borodina)、安德列•加維羅夫(Andrei Gavrilov)和亞歷山大•貝爾尼茨基(Aleksandr Belnitskii),他們始終在我身後,給予我信任和支持我。特別感謝維拉•克裡弗茨(Vera Krivets),她幫助我潤色英文。
柏特•貝茨(Bert Bates)和布萊恩•哈納菲(Brian Hanafee)的教導和理念深刻地影響了我對教學和講解複雜概念的方式。感謝二位的寶貴建議和貢獻。
我深深感謝Manning出版社的團隊。邁克•斯蒂芬斯(Mike Stephens)引領了這場激動人心的冒險,我對他的感激無以言表,感謝他給予我此次機會。艾恩•豪(Ian Hough)耐心地逐章 幫我修正書中的英文錯誤,感謝他説明我編輯本書。亞瑟•朱巴列夫(Arthur Zubarev),感謝他不厭其煩地審閱初稿中的錯誤並提供有價值的回饋。
勞•科維(Lou Covey),我想為我偶爾的失禮向他表示歉意,感謝他給予我的持續鼓勵。馬克•湯瑪斯(Mark Thomas),感謝他對本書進行技術審閱和代碼檢查。蒂凡尼•泰勒(Tiffany Taylor)的精細工作和專業知識顯著提高了本書的清晰度和連貫性。凱蒂•坦納(Katie Tennant),沒有他十分細緻的審查和編輯,本書內容不可能得以完善並成功出版。
對於本書所有的審閱者,包括阿祖吉特•納亞克(Abhijith Nayak)、阿姆拉•烏穆德魯(Amrah Umudlu)、安德列斯•薩科(Andres Sacco)、阿納德•貝利(Arnaud Bailly)、巴爾比爾•辛格(Balbir Singh)、比吉斯•科馬蘭(Bijith Komalan)、克裡福德•薩伯(Clifford Thurber)、大衛•雅科博維奇(David Yakobovitch)、德米特裡•沃羅比烏夫(Dmitry Vorobiov)、埃德度•梅倫德斯(Eddu Melendez)、埃爾內斯托•阿羅約(Ernesto Arroyo)、埃內斯托•波西(Ernesto Bossi)、艾山•坦德遜(Eshan Tandon)、埃茲拉•雪裡德(Ezra Schroeder)、弗蘭斯•歐林基(Frans Oilinki)、甘盛•斯瓦米納汀(Ganesh Swaminathan)、格雷•古森斯(Glenn Goossens)、葛列格里•瓦爾吉塞(Gregory Varghese)、伊瑪克麗特•雷斯托•莫莎(Imaculate Resto Mosha)、詹姆斯•祖吉恩•劉(James Zhijun Liu)、吉裡•捷西涅克拉(Ji•í •in•ura)、約翰頓•裡維斯(Jonathan Reeves)、拉瓦尼亞•埃姆•克(Lavanya M K)、盧克•羅格(Luc Rogge)、馬諾傑•雷德迪(Manoj Reddy)、馬特•古柯斯基(Matt Gukowsky)、馬特•惠爾克(Matt Welke)、米卡勒•達特雷(Mikael Dautrey)、諾蘭•托(Nolan To)、奧利弗•科頓(Oliver Korten)、派翠克•戈茨(Patrick Goetz)、派翠克•雷金(Patrick Regan)、拉古納斯•賈瓦哈爾(Ragunath Jawahar)、薩伊•赫格德(Sai Hegde)、賽爾吉奧•阿貝羅•羅德里格茲(Sergio Arbeo Rodríguez)、舍羅希卡•庫拉蒂拉克(Shiroshica Kulatilake)、文卡塔•納格恩達•巴布•亞納馬達拉(Venkata Nagendra Babu Yanamadala)、維塔利•拉爾什諾科夫(Vitaly Larchenkov)和威廉•詹米爾(William Jamir),感謝他們為本書提供了寶貴的建議,使本書品質更上一層樓。
我還要特別感謝無私奉獻的幕後英雄們。雖然他們的付出默默無聞,但其意義重大。他們是真正的明星!
最後,就像斯諾普•道格(Snoop Dogg)所言,我還要感謝我自己。如果沒有我,就沒有這本書。
前 言
暢想一個技術飛速發展的世界,其演進的速度遠超狂奔的獵豹,人們對高效併發程式設計的需求達到了前所未有的程度。在這個世界中,軟體工程師面臨嚴峻的挑戰,既要構建足以應對海量資料並能進行高速處理的系統,同時還要滿足使用者無盡的需求。這是一個併發既令人著迷又充滿困惑的時代,而我們正生活在這個時代。
我曾經深受併發問題的困擾。後來,我偶然瞭解到”併發”和”非同步”的概念,這無異於發現了一處隱藏的寶藏。如果能善加利用這份秘而不露的寶貴資源,就可以將普通代碼變成算力驚人的程式。然而,這份寶藏非常複雜,涉及許多技術名詞,比如併發、並行、執行緒、進程、多工和協程等。為了揭開併發程式設計的神秘面紗,我渴望找到一位嚮導,幫助我將所有知識條理清晰地串聯起來。但是,由於一直未能找到能夠將不同程式設計語言理論與實踐結合起來的教程,我決定親自著手編寫。《併發程式設計圖解》一書就是這樣誕生的。希望本書能夠成為各位讀者探索知識迷宮的指南針,解開謎題,照亮前行。
不同于普通技術圖書,本書特意插入了許多讀者感興趣的故事和趣聞。相比於理論書籍,本書更像是一本風趣幽默的故事書,並配有多幅幽默的插圖,讀者不妨細數!在保持風趣幽默的同時,本書也不隱瞞對餃子和比薩的喜愛,學習併發程式設計本就是一件趣事!
本書將陪伴讀者一同征服併發程式設計中的難題,解密非同步程式設計的謎團。從併發基礎知識到async和await的使用,本書將使用Python語言作為學習過程中的可靠夥伴。即使讀者對Python不夠熟悉也無需擔心,本書涉及的概念和方法並不局限於具體實現。
然而,讀者可能會想:”為什麼偏要選擇Python呢?”這是因為Python在簡單和強大之間實現了完美的平衡,能讓開發者專注於併發的本質。此外,作為作者,我也毫不隱瞞對Python的喜愛。
無論你是希望加深對併發系統理解的資深開發者,還是對併發底層機制抱有好奇心的新人,本書都有適合你的內容。通過挖掘併發程式設計的秘密,讀者將學習如何構建可擴展、高效和有彈性的軟體系統,以應對任何挑戰。
親愛的讀者,準備開啟一段獨特的學習之旅吧!在這段旅程中,時空的界限將變得模糊,程式會以章 魚般的節 奏”舞動”。是的,你沒聽錯——章 魚。作為來自深海的可愛生物,其八條觸鬚配合得天衣無縫,就像併發系統一樣既複雜又迷人。我們的旅程馬上開啟!
關於本書
併發、非同步和並行程式設計領域繁冗複雜,本書力求用清晰且幽默的方式講解其中的基礎知識和實踐技巧。不同於學術研究論文和程式設計圖書,本書重點介紹底層思想和原理,而不是具體的實現細節 。本書使用了風趣易懂的語言,並利用圖表而不是複雜的數學概念進行闡釋。通過閱讀本書,讀者將瞭解併發程式設計框架,並能在實際開發場景中使用可擴展的解決方案。本書填補了市場空白,為想要掌握併發和非同步的開發者提供了一條學習捷徑,並提供了全面且易懂的指南。否則,開發者可能需要多年的開發經驗才能真正理解併發程式設計的精髓。
目標讀者
本書適合想要瞭解併發程式設計基礎知識的讀者。為了充分利用好本書,讀者應具備電腦系統、程式設計語言和資料結構的基礎知識,以及順序程式設計方面的經驗。讀者不需要具備作業系統方面的知識,因為本書已提供所有必要的資訊。雖然本書涉及網路概念,但不會對其進行詳細討論,因此假定讀者具備網路基礎知識。讀者不需要對這些主題有深入瞭解,如果有需要,可在閱讀本書的同時再進一步學習。
本書內容
本書分三篇。第一篇”章 魚交響樂團:併發交響曲”,介紹了基本概念和編寫併發程式的方法。通過分層的方式,從硬體層到應用層,第1~5章 介紹了併發的基礎知識。