搜尋
首頁後端開發Golang關於Golang channel的實現

關於Golang channel的實現

May 06, 2021 am 10:00 AM
golang

以下由golang教學專欄跟大家介紹關於Golang channel的實現,希望對需要的朋友有幫助!

一.簡介

       channel是Go語言在語言層級提供的goroutine間的溝通方式,可以使用channel在兩個或多個goroutine之間傳遞訊息。 channel是進程內通訊方式,因此透過channel傳遞物件的過程和呼叫函數時的參數傳遞行為比較一致,例如也可以傳遞指標。如果需要跨進程通信,建議使用分散式系統來解決,例如使用Socket或HTTP等通信協定。

       channel是型別相關的,也就是說,一個chennel只能傳遞一個型別的值,這個型別需要在宣告channel時指定。注意,在GO語言中channel本身也是一個原生類型,與map之類的類型地位一樣,因此channel本身在定義後也可以透過channel傳遞。

二.底層實作

2.1 hchan結構

type hchan struct {
   qcount   uint           // 队列中当前数据的个数
   dataqsiz uint           // size of the circular queue
   buf      unsafe.Pointer // 数据缓冲区,存放数据的环形数组
   elemsize uint16 // channel中数据类型的大小(单个元素的大小)
   closed   uint32 // 表示channel是否关闭标识位
   elemtype *_type // 队列中的元素类型
   sendx    uint   // 当前发送元素的索引
   recvx    uint   // 当前接收元素的索引
   recvq    waitq  // 接受等待队列,由recv行为(也就是<-ch)阻塞在channel上的goroutine队列
   sendq    waitq  // 发送等待队列, 由send行为(也就是ch<-)阻塞在channel上的goroutine队列
   //lock保护chann中的所有字段,以及在此通道上阻塞的sudoG中的几个字段。
   //保持此锁时不要更改另一个G状态(特别是没准备好G),因为这可能会因堆栈收缩而死锁
   lock mutex
}

//发送及接收队列的·1结构体
type waitq struct {
    first *sudog
    last  *sudog
}
  • qcount uint // 目前佇列中剩餘元素個數。
  • dataqsiz uint // 環形佇列長度,即緩衝區的大小,即make(chan T,N),N。
  • buf unsafe.Pointer // 環形佇列指標。
  • elemsize uint16 // 每個元素的大小。
  • closed uint32 // 表示目前頻道是否處於關閉狀態。建立通道後,此欄位設為0,即通道開啟; 透過呼叫close將其設為1,通道關閉。
  • elemtype *_type // 元素類型,用於資料傳遞過程中的賦值。
  • sendx uint 和 recvx uint是環形緩衝區的狀態字段,它指示緩衝區的當前索引- 支援數組,它可以從中發送資料和接收數據。
  • recvq waitq // 等待讀取訊息的goroutine佇列。
  • sendq waitq // 等待寫​​訊息的goroutine隊列。
  • lock mutex // 互斥鎖,為每個讀寫操作鎖定通道,因為傳送和接收必須是互斥操作。

 

2.2 建立流程

2.2.1 寫入動作

1.建立帶有buffer的channel

#2.寫入資料

#3.3 寫入過程如下:

  • 鎖定整個管道結構。
  • 確定寫入,嘗試從等會帶隊列等待goroutine,然後將元素直接寫入goroutine。
  • 如果recvq為空,則確定緩衝區是否可用。如果可用,請從目前goroutine複製資料到緩衝區。
  • 如果緩衝區已滿,則要寫入的元素將保存在目前正在執行的goroutine結構中,並且當前goroutine將在sendq中排隊並從運行中掛起。
  • 寫入完成釋放鎖定。

2.2.2 讀取過程

  • 先讀取channel全域鎖定。
  • 嘗試sendq從等待隊列中取得等待的goroutine。
  • 如果有等待的goroutine,且有緩衝區(緩衝區已滿),從緩衝區隊首取出數據,再從sendq取出一個goroutine。將goroutine中資料存入buf對位,結束讀取釋放鎖。
  • 如沒有後等待的goroutine,且緩衝區有數據,直接讀取緩衝區數據,解釋讀取釋放鎖。
  • 如果沒有等待的goroutine,且沒有緩衝或緩衝區域為空,將當前的goroutine加入denq排隊,進入睡眠,等待被寫goroutine喚醒。結束釋放鎖。
#

以上是關於Golang channel的實現的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:csdn。如有侵權,請聯絡admin@php.cn刪除
在Golang和Python之間進行選擇:適合您的項目在Golang和Python之間進行選擇:適合您的項目Apr 19, 2025 am 12:21 AM

golangisidealforperformance-Critical-clitageAppations and ConcurrentPrompromming,而毛皮刺激性,快速播種和可及性。 1)forhigh-porformanceneeds,pelectgolangduetoitsefefsefefseffifeficefsefeflicefsiveficefsiveandconcurrencyfeatures.2)fordataa-fordataa-fordata-fordata-driventriventriventriventriventrivendissp pynonnononesp

Golang:並發和行動績效Golang:並發和行動績效Apr 19, 2025 am 12:20 AM

Golang通過goroutine和channel實現高效並發:1.goroutine是輕量級線程,使用go關鍵字啟動;2.channel用於goroutine間安全通信,避免競態條件;3.使用示例展示了基本和高級用法;4.常見錯誤包括死鎖和數據競爭,可用gorun-race檢測;5.性能優化建議減少channel使用,合理設置goroutine數量,使用sync.Pool管理內存。

Golang vs. Python:您應該學到哪種語言?Golang vs. Python:您應該學到哪種語言?Apr 19, 2025 am 12:20 AM

Golang更適合系統編程和高並發應用,Python更適合數據科學和快速開發。 1)Golang由Google開發,靜態類型,強調簡潔性和高效性,適合高並發場景。 2)Python由GuidovanRossum創造,動態類型,語法簡潔,應用廣泛,適合初學者和數據處理。

Golang vs. Python:性能和可伸縮性Golang vs. Python:性能和可伸縮性Apr 19, 2025 am 12:18 AM

Golang在性能和可擴展性方面優於Python。 1)Golang的編譯型特性和高效並發模型使其在高並發場景下表現出色。 2)Python作為解釋型語言,執行速度較慢,但通過工具如Cython可優化性能。

Golang vs.其他語言:比較Golang vs.其他語言:比較Apr 19, 2025 am 12:11 AM

Go語言在並發編程、性能、學習曲線等方面有獨特優勢:1.並發編程通過goroutine和channel實現,輕量高效。 2.編譯速度快,運行性能接近C語言。 3.語法簡潔,學習曲線平緩,生態系統豐富。

Golang和Python:了解差異Golang和Python:了解差異Apr 18, 2025 am 12:21 AM

Golang和Python的主要區別在於並發模型、類型系統、性能和執行速度。 1.Golang使用CSP模型,適用於高並發任務;Python依賴多線程和GIL,適合I/O密集型任務。 2.Golang是靜態類型,Python是動態類型。 3.Golang編譯型語言執行速度快,Python解釋型語言開發速度快。

Golang vs.C:評估速度差Golang vs.C:評估速度差Apr 18, 2025 am 12:20 AM

Golang通常比C 慢,但Golang在並發編程和開發效率上更具優勢:1)Golang的垃圾回收和並發模型使其在高並發場景下表現出色;2)C 通過手動內存管理和硬件優化獲得更高性能,但開發複雜度較高。

Golang:雲計算和DevOps的關鍵語言Golang:雲計算和DevOps的關鍵語言Apr 18, 2025 am 12:18 AM

Golang在雲計算和DevOps中的應用廣泛,其優勢在於簡單性、高效性和並發編程能力。 1)在雲計算中,Golang通過goroutine和channel機制高效處理並發請求。 2)在DevOps中,Golang的快速編譯和跨平台特性使其成為自動化工具的首選。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境