?Go 經典入門系列 20:并發(fā)入門
歡迎來到我們 Golang 系列教程[1]的第 20 篇。
Go 是并發(fā)式語言,而不是并行式語言。在討論 Go 如何處理并發(fā)之前,我們必須理解何為并發(fā),以及并發(fā)與并行的區(qū)別。
并發(fā)是什么?
并發(fā)是指立即處理多個任務的能力。一個例子就能很好地說明這一點。
我們可以想象一個人正在跑步。假如在他晨跑時,鞋帶突然松了。于是他停下來,系一下鞋帶,接下來繼續(xù)跑。這個例子就是典型的并發(fā)。這個人能夠一下搞定跑步和系鞋帶兩件事,即立即處理多個任務。
并行是什么?并行和并發(fā)有何區(qū)別?
并行是指同時處理多個任務。這聽起來和并發(fā)差不多,但其實完全不同。
我們同樣用這個跑步的例子來幫助理解。假如這個人在慢跑時,還在用他的 iPod 聽著音樂。在這里,他是在跑步的同時聽音樂,也就是同時處理多個任務。這稱之為并行。
從技術上看并發(fā)和并行
通過現(xiàn)實中的例子,我們已經明白了什么是并發(fā),以及并發(fā)與并行的區(qū)別。作為一名極客,我們接下來從技術的角度來考察并發(fā)和并行。:)
假如我們正在編寫一個 web 瀏覽器。這個 web 瀏覽器有各種組件。其中兩個分別是 web 頁面的渲染區(qū)和從網上下載文件的下載器。假設我們已經構建好了瀏覽器代碼,各個組件也都可以相互獨立地運行(通過像 Java 里的線程,或者通過即將介紹的 Go 語言中的 Go 協(xié)程來實現(xiàn))。當瀏覽器在單核處理器中運行時,處理器會在瀏覽器的兩個組件間進行上下文切換。它可能在一段時間內下載文件,轉而又對用戶請求的 web 頁面進行渲染。這就是并發(fā)。并發(fā)的進程從不同的時間點開始,分別交替運行。在這里,就是在不同的時間點開始進行下載和渲染,并相互交替運行的。
如果該瀏覽器在一個多核處理器上運行,此時下載文件的組件和渲染 HTML 的組件可能會在不同的核上同時運行。這稱之為并行。

并行不一定會加快運行速度,因為并行運行的組件之間可能需要相互通信。在我們?yōu)g覽器的例子里,當文件下載完成后,應當對用戶進行提醒,比如彈出一個窗口。于是,在負責下載的組件和負責渲染用戶界面的組件之間,就產生了通信。在并發(fā)系統(tǒng)上,這種通信開銷很小。但在多核的并行系統(tǒng)上,組件間的通信開銷就很高了。所以,并行不一定會加快運行速度!
Go 對并發(fā)的支持
Go 編程語言原生支持并發(fā)。Go 使用 Go 協(xié)程(Goroutine) 和信道(Channel)來處理并發(fā)。在接下來的教程里,我們還會詳細介紹它們。
并發(fā)的介紹到此結束。請留下你的反饋和評論。祝你愉快。
上一教程 - 接口 - II
下一教程 - Go 協(xié)程[2]
via: https://golangbot.com/concurrency/
作者:Nick Coghlan[3]譯者:Noluye[4]校對:polaris1119[5]
本文由 GCTT[6] 原創(chuàng)編譯,Go 中文網[7] 榮譽推出
參考資料
Golang 系列教程: https://studygolang.com/subject/2
[2]Go 協(xié)程: https://studygolang.com/articles/12342
[3]Nick Coghlan: https://golangbot.com/about/
[4]Noluye: https://github.com/Noluye
[5]polaris1119: https://github.com/polaris1119
[6]GCTT: https://github.com/studygolang/GCTT
[7]Go 中文網: https://studygolang.com/
推薦閱讀
