[譯] part 20: golang 併發介紹

咔嘰咔嘰發表於2019-04-01

Go 是一種併發語言,而不是並行語言。在討論如何在 Go 中處理併發之前,我們必須首先了解什麼是併發以及它與並行性的不同之處。

什麼是併發

併發是指有處理多個事情的能力,用一個例子來解釋。

可以比做一個人慢跑。在他早晨慢跑時,發現鞋帶已經鬆了。然後,這個人停止了跑步,綁鞋帶,然後又開始跑步。這是併發的典型示例。這個人能夠處理跑步和繫鞋帶,也就是說,這個人能夠處理很多事情,強調一段時間內能做多個事情 :)

什麼是並行,它與併發有什麼不同

並行性是指同時做了很多事情。它可能聽起來類似於併發,但它實際上是不同的。

我們還是用慢跑的例子來理解,我們假設這個人正在慢跑並且他還在 iPod 中聽音樂。在這種情況下,這個人同時在慢跑和聽音樂,也就是說,他正在做很多事情。強調時間是同時,這稱為並行性。

併發與並行

我們用了一個現實世界的例子來理解併發和並行有何不同。現在讓我們從更技術的角度來看待它們,因為我們是碼農 :)。

Web 瀏覽器具有各種元件。其中兩個是網頁的呈現和用於從網際網路下載檔案的下載程式。我們假設我們已經構建了我們的瀏覽器程式碼,使得每個元件都可以獨立執行(這是使用 Java 等語言中的執行緒完成的,我們可以使用 Goroutines 實現這一點,稍後將詳細介紹)。當此瀏覽器在單核處理器中執行時,處理器將在瀏覽器的兩個元件之間切換上下文。它可能有段時間正在下載檔案,然後它會切換到呈現使用者請求的網頁的html,這被稱為併發。

如果同一個瀏覽器在多核處理器上執行。在這種情況下,檔案下載元件和 HTML 呈現元件可以在不同的核心中同時執行。這被稱為並行性。

[譯] part 20: golang 併發介紹
[譯] part 20: golang 併發介紹

並行並不總是會帶來更快的執行時間。這是因為並行執行的元件可能必須相互通訊。例如,我們的瀏覽器在當檔案下載完成時,應該將其傳達給使用者,比如使用視窗彈出。此通訊發生在負責下載的元件和負責呈現使用者介面的元件之間。併發系統中的通訊開銷相比要低。在元件在多個核心中並行執行的情況下,這種通訊開銷很高。因此並行程式並不總能獲得更快的執行時間!

併發是 Go 程式語言內建的。Go 使用Goroutineschannel在處理併發。我們將在即將到來的教程中詳細討論它們。

相關文章