Go是併發語言,而不是並行語言。在討論Go併發性以前,咱們必須首先了解什麼是併發,以及併發與並行的區別。瀏覽器
什麼是併發
併發(concurrency)是指一次處理大量事情的能力。讓咱們用一個例子來講明。併發
假設一我的喜歡慢跑。在早上的慢跑中,他的鞋帶開了。如今他停下來繫鞋帶,而後繼續慢跑。這就是典型的併發。這我的有能力處理慢跑和繫鞋帶兩件事情,也就是說這我的一次處理了多個事情。spa
什麼是並行?並行與併發的區別在哪?
並行(parallelism)指的是同時處理多個事情。雖然聽起來像併發,可是它們是不一樣的。.net
一樣是慢跑的例子。此次讓咱們假設這個慢跑愛好者一邊慢跑一遍用他的 iPod 聽音樂。這個例子裏這位慢跑愛好者同時進行慢跑和聽音樂,也就是說這我的同時作了多件事情。這就是並行。線程
從技術觀點看併發和並行
咱們已經經過現實中的例子明白了什麼是並行,以及並行與併發的區別。如今讓咱們從更技術一點的角度來看待他們(誰讓咱們是怪胎呢?)。協程
假設咱們在實現一個 Web 瀏覽器。 Web 瀏覽器有許多模塊。其中的兩個是對頁面進行渲染的渲染器和從互聯網下載文件的下載器。讓咱們假設咱們已經很好的組織了咱們的代碼結構,使得這兩個組件能夠獨立的運行(這多是使用了 Java 中的線程,也可能使用了 Go 中的協程,咱們將稍後介紹 Go 協程)。當咱們的瀏覽器運行在單核 CPU 上時,CPU 將在瀏覽器的這兩個組件之間進行上下文切換。它可能(使用下載模塊)進行下載文件一段時間後,切換到渲染模塊去渲染用戶請求的HTML頁面。咱們已經知道這是併發。併發處理是從不一樣的時間點開始,而它們的執行週期是重疊的。在本例中,下載和渲染在不一樣的時間點開始,它們的執行是重疊的。blog
假設一樣的瀏覽器運行在多核 CPU 上。在這裏文件下載模塊和頁面渲染模塊能夠同時運行在 CPU 的不一樣核上。這就是咱們所說的並行。 同步
並行並不老是可以提高運行速度。這是由於並行的兩個模塊在運行的時候可能須要同步。例如,仍是這個瀏覽器的例子,當文件下載完成時,應該使用彈出窗口來通知用戶。而這種通訊發生在負責下載的組件和負責渲染用戶界面的組件之間。在併發系統中,這種通訊的開銷很低。而若是這兩個組件並行地運行在 CPU 的不一樣核上,這種通訊的開銷卻很大。所以並行程序並不必定會執行得更快。class
Go對併發的支持
Go 原生支持併發。在Go中,使用 Go 協程(Goroutine)和信道(channel)來處理併發。渲染
本文轉自:https://blog.csdn.net/u011304970/article/details/75095241