語(yǔ)言表達(dá)了我們的思維方式。我們?nèi)绾翁幚韱?wèn)題并制定解決方案取決于我們可以使用語(yǔ)言表達(dá)的概念。這對(duì)于編程語(yǔ)言也是如此。給定一個(gè)問(wèn)題,為解決該問(wèn)題而編寫(xiě)的程序可能因?yàn)檎Z(yǔ)言的不同而有較大的差異。本書(shū)講述的是如何用Go語(yǔ)言來(lái)表達(dá)并發(fā)算法并編寫(xiě)程序,以及如何了解這些程序的行為方式。
Go語(yǔ)言與許多流行語(yǔ)言的不同之處在于它強(qiáng)調(diào)可理解性。這與可讀性不同。許多用易于閱讀的語(yǔ)言編寫(xiě)的程序是難以理解的。過(guò)去,我也曾陷入使用使編程變得容易的框架來(lái)編寫(xiě)組織良好的程序的陷阱。這種方法的問(wèn)題在于,一旦編寫(xiě)完成,程序就開(kāi)始了自己的生命周期,而其他人則接管了它的維護(hù)工作。在開(kāi)發(fā)階段形成的專有知識(shí)丟失了,如果沒(méi)有原始開(kāi)發(fā)團(tuán)隊(duì)中最后一個(gè)人的幫助,那么團(tuán)隊(duì)留下的程序?qū)o(wú)法理解。開(kāi)發(fā)程序與寫(xiě)小說(shuō)沒(méi)有太大區(qū)別。小說(shuō)是為了讓別人讀而寫(xiě)的,程序也是如此。你的程序如果沒(méi)有人能理解,那么肯定無(wú)法長(zhǎng)期運(yùn)行。
本書(shū)將嘗試解釋如何在Go語(yǔ)言中使用并發(fā)結(jié)構(gòu)進(jìn)行思考,以便你在獲得一段代碼時(shí)能夠清晰地理解該程序?qū)⑷绾芜\(yùn)行,并且其他人也可以更輕松地理解你編寫(xiě)的程序。本書(shū)首先對(duì)并發(fā)以及Go語(yǔ)言的處理方式進(jìn)行較高層次上的闡釋,然后使用并發(fā)算法解決若干個(gè)實(shí)用的數(shù)據(jù)處理問(wèn)題。畢竟,編寫(xiě)程序就是為了處理數(shù)據(jù)。本書(shū)希望你理解并發(fā)模式是如何在解決現(xiàn)實(shí)問(wèn)題的同時(shí)全面發(fā)展的,這可以幫助你獲得高效使用該語(yǔ)言的技能。本書(shū)后面的章節(jié)還介紹更多示例,這些示例涉及計(jì)時(shí)、周期性任務(wù)、服務(wù)器編程、流媒體和原子內(nèi)存操作等。最后一章則討論故障排除和調(diào)試等。
限于篇幅,本書(shū)無(wú)法討論與并發(fā)相關(guān)的所有主題。還有很多領(lǐng)域沒(méi)有被探索。但是我相信,你一旦完成了本書(shū)中提供的所有示例,就會(huì)對(duì)使用并發(fā)解決問(wèn)題更有信心。每個(gè)人都在抱怨并發(fā)很難,但是,正確使用語(yǔ)言將使開(kāi)發(fā)人員可以更輕松地生成正確的程序。你應(yīng)該永遠(yuǎn)記住的經(jīng)驗(yàn)法則是:正確性優(yōu)先于性能。因此,我們首先要讓它正常工作,然后才能讓它更快地工作。
本書(shū)讀者
如果你是一名具有Go語(yǔ)言基礎(chǔ)知識(shí)并希望獲得高并發(fā)后端應(yīng)用程序開(kāi)發(fā)專業(yè)知識(shí)的開(kāi)發(fā)人員,那么這本書(shū)就是適合你的。本書(shū)還將吸引各種經(jīng)驗(yàn)水平的Go開(kāi)發(fā)人員,讓他們的后端系統(tǒng)更加健壯和可擴(kuò)展。
內(nèi)容介紹
本書(shū)共分10章,各章內(nèi)容如下。
第1章并發(fā)高級(jí)概述,詳細(xì)闡述并發(fā)是什么以及不是什么,特別是它與并行的關(guān)系。本章還介紹共享內(nèi)存和消息傳遞范式,以及常見(jiàn)的并發(fā)概念,如競(jìng)爭(zhēng)、原子性、死鎖和饑餓等。
第2章Go并發(fā)原語(yǔ),介紹用于并發(fā)編程的Go語(yǔ)言原語(yǔ),包括goroutine、通道、互斥體、等待組和條件變量等。
第3章Go內(nèi)存模型,詳細(xì)探討內(nèi)存操作的可見(jiàn)性保證,介紹happened-before關(guān)系,這允許你推理并發(fā)行為。本章還討論并發(fā)原語(yǔ)和一些標(biāo)準(zhǔn)庫(kù)函數(shù)的內(nèi)存可見(jiàn)性保證。
第4章一些眾所周知的并發(fā)問(wèn)題,研究著名的生產(chǎn)者/消費(fèi)者問(wèn)題、哲學(xué)家就餐問(wèn)題和速率限制算法。
第5章工作池和管道,詳細(xì)介紹工作池的機(jī)制,這是在有限并發(fā)下處理大量數(shù)據(jù)的常用方法。本章還演示多種并發(fā)數(shù)據(jù)管道實(shí)現(xiàn),以幫助你編寫(xiě)高效的數(shù)據(jù)處理應(yīng)用程序。
第6章錯(cuò)誤和恐慌處理,深入探討如何處理并發(fā)程序中的錯(cuò)誤和恐慌,以及如何傳遞錯(cuò)誤。
第7章Timer和Ticker,介紹一次性定時(shí)器Timer和周期性定時(shí)器Ticker。 Timer用于稍后運(yùn)行一些東西,而Ticker則可用于定期運(yùn)行一些東西。
第8章并發(fā)處理請(qǐng)求,主要討論服務(wù)器編程。本章討論的許多概念涉及處理多種請(qǐng)求,因此它們可以廣泛應(yīng)用于各種場(chǎng)景。本章描述如何有效地使用上下文、如何分配工作和收集結(jié)果、如何限制并發(fā)以及如何流傳輸數(shù)據(jù)。
第9章原子內(nèi)存操作,詳細(xì)闡釋原子內(nèi)存操作和它們的內(nèi)存保證,并演示原子的一些實(shí)際用途。
第10章解決并發(fā)問(wèn)題,討論讀取堆棧跟蹤信息這一被低估但必不可少的技能,以及如何在運(yùn)行時(shí)檢測(cè)故障并修復(fù)它們。
充分利用本書(shū)
你需要對(duì)Go語(yǔ)言以及適合你的操作系統(tǒng)運(yùn)行的Go開(kāi)發(fā)環(huán)境有基本的了解。本書(shū)不依賴任何第三方工具或庫(kù),你只需使用你最熟悉的代碼編輯器即可。所有示例和代碼示例都可以使用Go構(gòu)建系統(tǒng)進(jìn)行構(gòu)建和運(yùn)行。
下載示例代碼文件
本書(shū)的代碼包已經(jīng)托管在GitHub上,其網(wǎng)址如下:
https://github.com/PacktPublishing/Effective-Concurrency-in-Go
代碼如果有更新,則會(huì)在現(xiàn)有GitHub存儲(chǔ)庫(kù)上被更新。
下載彩色圖像
我們還提供了一個(gè)PDF文件,其中包含本書(shū)中使用的屏幕截圖/圖表的彩色圖像。你可以訪問(wèn)以下網(wǎng)址下載該文件:
https://packt.link/3rxJ9
本書(shū)約定
本書(shū)中使用了許多文本約定。
(1)代碼格式文本:表示文本中的代碼字、數(shù)據(jù)庫(kù)表名、文件夾名、文件名、文件擴(kuò)展名、路徑名、虛擬URL、用戶輸入和Twitter句柄等。以下段落就是一個(gè)示例:
本章源代碼可在本書(shū)配套的GitHub存儲(chǔ)庫(kù)中找到,其網(wǎng)址如下:
https://github.com/PacktPublishing/Effective-Concurrency-in-Go/tree/main/chapter4
(2)有關(guān)代碼塊的設(shè)置如下所示:
1: chn := make(chan bool) // 創(chuàng)建一個(gè)無(wú)緩沖通道
2: go func() {
3: chn <- true // 發(fā)送到通道
4: }()
5: go func() {
6: var y bool
7: y <-chn // 從通道接收
8: fmt.Println(y)
9: }()
(3)任何命令行輸入或輸出都是采用如下形式編寫(xiě)的:
{"row":65,"height":172.72,"weight":97.61}
{"row":64,"height":195.58,"weight":81.266}
{"row":66,"height":142.24,"weight":101.242}
{"row":68,"height":152.4,"weight":80.358}
{"row":67,"height":162.56,"weight":104.87400000000001}
(4)術(shù)語(yǔ)或重要單詞采用中英文對(duì)照形式給出,括號(hào)內(nèi)保留其英文原文,方便讀者進(jìn)行對(duì)照和查看。示例如下:
多年來(lái),人們已經(jīng)開(kāi)發(fā)出了若干種數(shù)學(xué)模型來(lái)分析和驗(yàn)證并發(fā)系統(tǒng)的行為。通信順序進(jìn)程(communicating sequential processes,CSP)就是影響Go語(yǔ)言設(shè)計(jì)的模型之一。在CSP中,系統(tǒng)由多個(gè)并行運(yùn)行的順序進(jìn)程組成。
(5)本書(shū)還使用了以下兩個(gè)圖標(biāo)。
表示警告或重要的注意事項(xiàng)。
表示提示信息或操作技巧。