首頁  >  文章  >  後端開發  >  golang 如何並發

golang 如何並發

(*-*)浩
(*-*)浩原創
2019-12-30 15:29:202303瀏覽

golang 如何並發

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn