Go語言中Channel機制

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

前段時間嘗試了一點 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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.