1. 程式人生 > >Go語言中Channel機制

Go語言中Channel機制

前段時間嘗試了一點 Google 的 Go 語言,感覺其很多特性還是不錯的。Go 語言旨在結合傳統編譯型的靜態語言和解釋型的動態語言的優點,在其中找到一個平衡。從而打造一個既快速(編譯執行),又方便程式設計的語言(動態語言往往語法簡單快捷)。同時,Go 語言還具備豐富的特性以支援併發程式設計,這在現在多核非常普及的情況下,是很重要和強大的一個功能。

  Go 語言的併發特性主要有 goroutine, channel 等。

  goroutine - 可以大致理解為一種輕量級的執行緒(或微執行緒),它是一種“分配在同一個地址空間內的,能夠並行執行的函式”。同時,它是輕量級的,不需要像分配執行緒那樣分配獨立的棧空間。所以理論上講,我們可以很容易的分配很多個 goroutine, 讓它們併發執行,而其開銷則比多執行緒程式要小得多,從而可以讓程式支援比較大的併發性。

  channel - 顧名思義,就是通道。通道的目的是用來傳遞資料。在一個通道上我們可以執行資料的傳送(Send)和接受(Receive)操作。對於非緩衝的 channel 而言,Receive 方法執行時,會判斷該通道上是否有值,如果沒有就會等待(阻塞),直到有一個值為止。同樣,在 channel 上有值,而尚未被一個 Receiver 接受的時候,Send 方法也會阻塞,直到 Channel 變空。這樣,通過一個簡單的機制就可以保證 Send 和 Receive 總是在不同的時間執行的,而且只有 Send 之後才能 Receive. 這樣就避免了常規的多執行緒程式設計中資料共享的問題。正如 Go 語言的文件一句話所說:

  Do not communicate by sharing memory; instead, share memory by communicating.

  不要通過共享記憶體來溝通;而是通過溝通來共享記憶體。

  在常規的多執行緒程式設計裡,我們總是定義好一些類變數,如果這些變數有可能被多個執行緒同時訪問,那麼就需要加鎖。這樣帶來了一定的程式設計複雜性,如果程式碼寫的稍有bug,則會導致讀/寫到錯誤的值。

  而通過 channel 來溝通,我們得到了一個更為清晰的溝通方式。兩個執行緒(或者 goroutine)要讀寫相同的資料,則建立一個通道,雙方通過對這個通道執行 Send / Receive 的操作來設值或取值即可,相對而言,比較不容易出錯。

<<GO語言簡介下>>

http://www.20ju.com/content/V227275.htm