Go的CSP並發模型
Go實作了兩種並發形式。第一種是大家普遍認知的:多執行緒共享記憶體。其實就是Java或C 等語言中的多執行緒開發。
另一種是Go語言特有的,也是Go語言推薦的:CSP(communicating sequential processes)並發模型。 (推薦學習:go)
CSP並發模型是在1970年左右提出的概念,屬於比較新的概念,不同於傳統的多線程透過共享記憶體來通信,CSP講究的是「以通訊的方式來共享記憶體」。
請記得下面這句話:
Do not communicate by sharing memory; instead, share memory by communicating. “不要以共享内存的方式来通信,相反,要通过通信来共享内存。”
普通的線程並發模型,就是像Java、C 、或者Python,他們線程間通訊都是透過共享內存的方式來進行的。
非常典型的方式就是,在訪問共享資料(例如數組、Map、或某個結構體或物件)的時候,透過鎖來訪問,因此,在很多時候,衍生出一種方便操作的資料結構,叫做「線程安全的資料結構」。
例如Java提供的套件」java.util.concurrent」中的資料結構。 Go中也實作了傳統的線程並發模型。
Go的CSP並發模型,是透過goroutine和channel來實現的。
goroutine 是Go語言中並發的執行單位。有點抽象,其實就是和傳統概念上的」線程「類似,可以理解為」線程「。
channel是Go語言中各個並發結構體(goroutine)之前的溝通機制。通俗的講,就是各個goroutine之間通信的」管道“,有點類似於Linux中的管道。
產生一個goroutine的方式非常的簡單:Go一下,就產生了。
go f();
通訊機制channel也很方便,傳送資料用channel <- data,取資料用<-channel。
在通訊過程中,傳資料channel <- data和取資料<-channel必然會成對出現,因為這邊傳,那邊取,兩個goroutine之間才會實現通訊。
而且不管傳還是取,必阻塞,直到另外的goroutine傳或取為止。
有兩個goroutine,其中一個發起了向channel中發起了傳值操作。 (goroutine為矩形,channel為箭頭)
以上是golang 如何並發的詳細內容。更多資訊請關注PHP中文網其他相關文章!