深入理解Go并發編程:從原理到實踐,看這本就夠了 ( 簡體 字) |
作者:晁岳攀(@鳥窩) | 類別:1. -> 程式設計 -> Go語言 |
譯者: |
出版社:電子工業出版社 | 3dWoo書號: 56324 詢問書籍請說出此書號!【有庫存】 NT售價: 790 元 |
出版日:11/1/2023 |
頁數:416 |
光碟數:0 |
|
站長推薦: |
印刷:黑白印刷 | 語系: ( 簡體 版 ) |
|
加入購物車 │加到我的最愛 (請先登入會員) |
ISBN:9787121466465 |
作者序 | 譯者序 | 前言 | 內容簡介 | 目錄 | 序 |
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證) |
作者序: |
譯者序: |
前言:歷時五年,本書終于和讀者見面了。
五年,不長也不短。五年,可以讓我有充足的時間來沉淀、挖掘和整理Go并發相關知識,為讀者呈現一本全面且深入的Go并發知識的書。五年來,相關的Go并發知識也在不斷地更新,比如Go內存模型的重新定義、atomic 包更新,以及互斥鎖和讀寫鎖終于加上了 TryLock 方法等,對這些同步原語內部的實現也有優化,相關的最新變動也都體現在本書中。
從 2018年開始,我就有意地梳理Go并發編程的知識。2019年,在GopherChina大會上做了第一次分享,后來又在滴滴出行做過專門的研討課,再后來,我在“極客時間”上做了一個《Go并發編程實戰課》專欄,大家反映也比較好。
其實,我很早就想把“極客時間”上的專欄內容整理出來,再加上這幾年我對Go并發編程的新的理解和總結,把它打造成一本全面且深入的Go并發編程的書。Go非常適合并發編程,學習Go語言的人感受最深,但是熟練掌握并發編程并不是一件簡單的事情, 比如知名的Go生態圈的項目,包括Go語言本身,也都出現過很多并發編程的錯誤。有些書也介紹了Go標準庫的幾個同步原語,并簡單介紹了其使用方法,但是讀者覺得不過癮。所以,我很想盡快將這些內容整理成書,但是一拖就是三四年,“忙”是我用來解釋這本書現在才出版的一個借口,“遲疑”才是我一拖再拖的原因。
我有兩個遲疑的點:一是我一直在思考,當前我整理出來的Go并發知識是否已經足夠全面?我不想出一本關于Go并發編程的書,只是介紹Go并發編程的部分知識,我想系統地覆蓋Go并發編程的各個方面,讓想學習Go并發編程的讀者看這一本書就足夠了。所以,這幾年我也一直在整理、分析和補充Go并發編程的資料,現在終于到了它“出山”的時候。
二是我有點兒個人化。我期望這本書讀者閱讀起來非常舒服、有條理。多年前我也出過書,這么多年我也閱讀過很多計算機方面的書。我個人覺得書籍的排版、樣式、插圖、 顏色非常影響讀者的讀書興趣,我期望這本書能夠有良好的排版、舒服的字體和間距、漂亮的插圖,并且彩色印刷。我夫人經常嘲笑我這是買櫝還珠,但是我還是期待能夠遇到與我的這種執念一致的“有緣人”,直到看到《深入理解Linux網絡》這本書,通過作者彥飛認識了知名的出版策劃人姚新軍老師,一拍即合,本書才得以出版。我個人雖然沒有美術細胞,但是我從讀者的角度希望本書能夠以Gopher卡通的形象,最好以中國傳統古典風格設計插圖。我看了相關的插圖和排版,我個人非常喜歡,相信讀者閱讀起來也會覺得妙趣橫生。
當然,為避免“金玉其外,敗絮其中”的結局,本書還是致力于干貨的介紹,也不枉讀者送我“鳥窩出品,必是干貨”的稱號。本書內容經過仔細的設計,有清晰的脈絡可以遵循,內容由淺入深,適合各層次的Go語言愛好者學習,甚至買回來當一本工具書備查也是不錯的。
本書特色
● 全面。本書詳細介紹了Go標準庫中的每一個同步原語,并且補充介紹了Go官方擴展庫的同步原語,以及很多第三方的并發庫。本書還全面介紹了基于 etcd 的分布式同步原語,讀者在開發分布式程序的時候它很有參考價值。本書還梳理了Go并發模式,讀者可以系統性地了解采用并發模式要解決的問題。
● 由淺入深。每個同步原語一開始都會介紹其使用場景和基本的使用方法,很多同步原語都會介紹其實現,讀者可以深入了解同步原語背后的原理。書中有作者多年開發經驗的總結和梳理,讓讀者少走彎路。
● 實戰。書中包含大量的示例,獨創性地梳理了同步原語使用陷阱,還專門列出了知名項目如Kubernetes、Docker、gRPC 等項目中出現的并發錯誤,讓讀者切身感受到知名項目的有經驗的Go程序員也會犯的錯。
● 獨立。各章之間沒有依賴性,每一章都是獨立的,讀者可以從任意一章開始進行學習。正如“極客時間”的一位讀者所說,課程需要反復學幾遍才能理解透,所以希望讀者也能勤翻一翻本書,多學習幾遍,把相關知識掌握透徹。
讀者對象
這是一本專門講解Go并發編程的書。雖然本書面對的是Go初級、中級、高級的程序員, 但還是希望讀者有基本的Go語言知識,至少要花半天時間先學習一下Go語言的基本編程知識,因為我在一些場合聽到其他語言的程序員說半天就可以掌握Go語言了(當然也可以看看其他編程語言的程序,和其他語言的并發編程做一個對比,很多知識都是相通的, 可以借鑒)。
任何想使用Go語言進行編程的朋友,無論是在校的學生,還是企業中有志于使用Go語言編程的程序員,建議都看一看本書。 |
內容簡介:本書從標準庫的并發原語講起,循序漸進的介紹擴展庫、分布式的并發原語、并發模式和經典并發問題。內容從并發原語的使用場景、使用方法、常見錯誤,內部實現多層次的講解,全面的介紹Go并發的知識。全書分為三個部分,主要部分又分為四個層次。第一部分主要介紹Go標準庫提供的各種并發類型(并發原語)的知識,方便初學Go語言的同學能夠掌握好Go語言的基礎能力,包括一些Go開發者都不熟悉的類型。第二部分屬于拔高的內容,介紹積累優秀的擴展庫,幫助Go開發者擴展思維,提高視野。這些擴展庫如果能夠掌握,在工作中會大有裨益。第三部分介紹分布式并發原語。這部分內容鮮有人介紹,但是屬于互聯網公司常用的一些場景,尤其是開發大型分布式項目。很多讀者缺乏這方面的經驗和機會,通過閱讀此書,可以彌補這方面的知識的缺乏和實戰的機會。 |
目錄:第1章 Go并發編程和調度器
1.1 Go特別適合并發編程
1.2 并發 vs 并行
1.3 阿姆達爾定律:并發編程優化是有上限的
1.4 Go并發并不一定最快
1.5 Go運行時調度器
第2章 互斥鎖 Mutex
2.1 競爭條件與數據競爭
2.2 Mutex的用法
2.2.1 一個并發問題
2.2.2 Mutex的使用
2.2.3 地道的用法
2.3 檢查程序中的數據競爭
2.4 Mutex的歷史實現
2.4.1 初始版本
2.4.2 多給新的 goroutine 一些機會
2.4.3 多給競爭者一些機會
2.4.4 解決饑餓問題
2.4.5 TryLock
2.5 Mutex的使用陷阱
2.5.1 誤寫
2.5.2 死鎖
2.5.3 鎖重入
2.5.4 復制鎖
2.6 Mutex的擴展
2.6.1 可重入鎖
2.6.2 支持并發 map
2.6.3 封裝值
第3章 讀寫鎖 RWMutex
3.1 讀寫鎖的使用場景
3.2 讀寫鎖的使用方法
3.3 讀寫鎖的實現
3.3.1 RLock的實現
3.3.2 RUnlock的實現
3.3.3 Lock的實現
3.3.4 Unlock的實現
3.3.5 TryLock的實現
3.3.6 TryRLock的實現
3.4 讀寫鎖的使用陷阱
3.4.1 鎖重入
3.4.2 死鎖
3.4.3 發現死鎖
3.5 讀寫鎖的擴展
第4章 任務編排好幫手 WaitGroup
4.1 WaitGroup的使用方法
4.2 WaitGroup的實現
4.3 WaitGroup的使用陷阱
4.3.1 Add 方法調用的時機不對
4.3.2 計數器的值為負數
4.3.3 錯誤的調用 Add的時機
4.3.4 知名項目中關于 WaitGroup 使用的 bug
4.4 WaitGroup的擴展
4.5 noCopy:輔助 vet 檢查
第5章 條件變量 Cond
5.1 Cond的使用方法
5.2 Cond的實現
5.3 Cond的使用陷阱
5.3.1 調用 Wait 時沒有加鎖
5.3.2 喚醒之后不檢查判斷條件
5.4 在實際項目中使用 Cond的例子
第6章 單例化利器 Once
6.1 Once的使用方法
6.2 Once的實現
6.3 Once的使用陷阱
6.3.1 死鎖
6.3.2 未初始化
第7章 并發 map
7.1 線程安全的 map
7.1.1 使用 map的兩種常見錯誤
7.1.2 加讀寫鎖:擴展 map,支持并發讀/寫
7.2 sync.Map的使用方法
7.3 sync.Map的實現
7.3.1 Swap 方法
7.3.2 Load 方法
7.3.3 Delete 方法
7.4 分片加鎖:更高效的并發map
7.5 lock-free map
第8章 池 Pool
8.1 sync.Pool的使用方法
8.2 sync.Pool的實現
8.2.1 Get 方法的實現
8.2.2 Put 方法的實現
8.3 sync.Pool的使用陷阱
8.4 連接池
8.4.1 標準庫中的 HTTP Client 池
8.4.2 數據庫連接池
8.4.3 TCP 連 接池
8.4.4 Memcached Client 連接池
8.4.5 net/rpc 中的 Request/Response 對象池
8.5 goroutine/worker 池
第9章 不止是上下文:Context
9.1 Context的發展歷史
9.2 Context的使用方法
9.2.1 基本用法
9.2.2 傳遞上下文
9.2.3 可撤銷的上下文
9.2.4 帶超時功能的上下文
9.3 Context 實戰
9.4 Context的使用陷阱
9.5 Context的實現
9.5.1 WithValue的實現
9.5.2 WithCancel的實現
9.5.3 WithDeadline的實現
第10章 原子操作
10.1 原子操作的基礎知識
10.2 原子操作的使用場景
10.3 atomic 提供的函數和類型
10.3.1 AddXXX 函數
10.3.2 CompareAndSwapXXX 函數
10.3.3 SwapXXX 函數
10.3.4 LoadXXX 函數
10.3.5 StoreXXX 函數
10.3.6 Value 類型
10.3.7 Bool、Int32、Int64、Pointer、Uint32、Uint64、Uintptr
10.4 uber-go/atomic 庫
10.5 lock-free 隊列的實現
10.6 原子性和可見性
第11章 channel 基礎:另辟蹊徑解決并發問題
11.1 channel的歷史
11.2 channel的應用場景
11.3 channel的基本用法
11.4 channel的實現
11.4.1 channel的數據結構
11.4.2 初始化
11.4.3 發送數據
11.4.4 接收數據
11.4.5 關閉 channel
11.5 channel的使用陷阱 / 224
11.5.1 panic 和 goroutine 泄漏
11.5.2 知名項目踩過的坑
第12章 channel的內部實現和陷阱
12.1 使用反射操作 select 和 channel
12.2 channel的應用場景
第13章 Go內存模型
13.1 指令重排和可見性的問題
13.2 sequenced before、synchronized before 和 happens before
13.3 各種同步原語的同步保證
13.3.1 初始化
13.3.2 goroutine的運行
13.3.3 channel
13.3.4 鎖(Mutex 和 RWMutex)
13.3.5 Once
13.3.6 WaitGroup
13.3.7 atomic操作
13.3.8 Finalizer、sync.Cond、sync.Map 和 sync.Pool
13.4 不正確的同步
第14章 信號量 Semaphore
14.1 什么是信號量
14.1.1 P/V 操作
14.1.2 信號量和互斥鎖的區別與聯系
14.2 信號量的 channel 實現
14.3 Go官方的信號量實現
14.4 使用信號量的常見錯誤
第15章 緩解壓力利器 SingleFlight
15.1 SingleFlight的實現
15.2 SingleFlight的使用場景
第16章 循環屏障 CyclicBarrier
16.1 CyclicBarrier的使用場景
16.2 CyclicBarrier的實現
16.3 使用 CyclicBarrier的例子
第17章 分組操作
17.1 ErrGroup
17.1.1 ErrGroup的基本用法
17.1.2 ErrGroup 使用示例
17.2 其他實用的 Group 同步原語
17.2.1 SizedGroup/ErrSizedGroup
17.2.2 gollback
17.2.3 Hunch
17.2.4 schedgroup
第18章 限流
18.1 基于令牌桶實現的限流庫
18.1.1 x/time/rate
18.1.2 juju/ratelimit
18.2 基于漏桶實現的限流庫
18.3 分布式限流
第19章 Go并發編程和調度器
19.1 Leader 選舉
19.1.1 選舉
19.1.2 查詢
19.1.3 監控
19.2 鎖 Locker
19.3 互斥鎖 Mutex
19.4 讀寫鎖 RWMutex
19.5 分布式隊列和優先級隊列
19.6 分布式屏障
19.7 計數型屏障
19.8 軟件事務內存
第20章 并發模式
20.1 并發模式概述
20.2 半異步/半同步模式
20.3 活動對象模式
20.4 斷路器模式
20.5 截止時間和超時模式
20.6 回避模式
20.7 雙重檢查模式
20.8 保護式掛起模式
20.9 核反應模式
20.10 調度器模式
20.11 反應器模式
20.12 Proactor模式
20.13 percpu模式
20.14 多進程模式
第21章 經典并發問題解析
21.1 哲學家就餐問題
21.1.1 模擬哲學家就餐問題
21.1.2 解法一:限制就餐人數
21.1.3 解法二:奇偶處理方法
21.1.4 解法三:資源分級
21.1.5 解法四:引入服務生
21.2 理發師問題
21.2.1 使用 sync.Cond 解決理發師問題
21.2.2 使用 channel 實現信號量
21.2.3 有多個理發師的情況
21.3 水工廠問題
21.4 fizz buzz 問題
21.4.1 將并發轉為串行
21.4.2 使用同一個channel
21.4.3 使用CyclicBarrier |
序: |