- 原文地址:Part 22: Introduction to Concurrency
- 原文作者:Naveen R
- 譯者:咔嘰咔嘰 轉載請註明出處。
Go 是一種併發語言,而不是並行語言。在討論如何在 Go 中處理併發之前,我們必須首先了解什麼是併發以及它與並行性的不同之處。
什麼是併發
併發是指有處理多個事情的能力,用一個例子來解釋。
可以比做一個人慢跑。在他早晨慢跑時,發現鞋帶已經鬆了。然後,這個人停止了跑步,綁鞋帶,然後又開始跑步。這是併發的典型示例。這個人能夠處理跑步和繫鞋帶,也就是說,這個人能夠處理很多事情,強調一段時間內能做多個事情 :)
什麼是並行,它與併發有什麼不同
並行性是指同時做了很多事情。它可能聽起來類似於併發,但它實際上是不同的。
我們還是用慢跑的例子來理解,我們假設這個人正在慢跑並且他還在 iPod 中聽音樂。在這種情況下,這個人同時在慢跑和聽音樂,也就是說,他正在做很多事情。強調時間是同時,這稱為並行性。
併發與並行
我們用了一個現實世界的例子來理解併發和並行有何不同。現在讓我們從更技術的角度來看待它們,因為我們是碼農 :)。
Web 瀏覽器具有各種元件。其中兩個是網頁的呈現和用於從網際網路下載檔案的下載程式。我們假設我們已經構建了我們的瀏覽器程式碼,使得每個元件都可以獨立執行(這是使用 Java 等語言中的執行緒完成的,我們可以使用 Goroutines 實現這一點,稍後將詳細介紹)。當此瀏覽器在單核處理器中執行時,處理器將在瀏覽器的兩個元件之間切換上下文。它可能有段時間正在下載檔案,然後它會切換到呈現使用者請求的網頁的html
,這被稱為併發。
如果同一個瀏覽器在多核處理器上執行。在這種情況下,檔案下載元件和 HTML 呈現元件可以在不同的核心中同時執行。這被稱為並行性。
並行並不總是會帶來更快的執行時間。這是因為並行執行的元件可能必須相互通訊。例如,我們的瀏覽器在當檔案下載完成時,應該將其傳達給使用者,比如使用視窗彈出。此通訊發生在負責下載的元件和負責呈現使用者介面的元件之間。併發系統中的通訊開銷相比要低。在元件在多個核心中並行執行的情況下,這種通訊開銷很高。因此並行程式並不總能獲得更快的執行時間!
併發是 Go 程式語言內建的。Go 使用Goroutines
和channel
在處理併發。我們將在即將到來的教程中詳細討論它們。