欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

goFrame的gqueue與channe的區(qū)別

 更新時(shí)間:2022年06月08日 10:52:37   作者:??王中陽(yáng)Go????  
這篇文章主要介紹了goFrame的gqueue與channe的區(qū)別,channel的作用是用于go協(xié)程間的通信,goroutine和channel是支持高并發(fā)的重要組成部分,更多兩者詳細(xì)介紹需要的小伙伴可以參考下面文章內(nèi)容

channel

首先明確一下channel的作用:用于go協(xié)程間的通信。

go語(yǔ)言最大的特點(diǎn)就是支持高并發(fā):goroutine和channel是支持高并發(fā)的重要組成部分。

單純地將函數(shù)并發(fā)執(zhí)行是沒有意義的。函數(shù)與函數(shù)間需要交換數(shù)據(jù)才能體現(xiàn)并發(fā)執(zhí)行函數(shù)的意義。

如果說(shuō) goroutine 是Go程序并發(fā)的執(zhí)行體,channel就是它們之間的連接。channel是可以讓一個(gè) goroutine 發(fā)送特定值到另一個(gè) goroutine 的通信機(jī)制。

另外要明確知道go的并發(fā)哲學(xué),銘記這句原則:用通信來(lái)共享內(nèi)存,而不要用共享內(nèi)存來(lái)通信。

在搞清楚channel的作用之后我們?cè)賮?lái)研究GoFrame框架(下文簡(jiǎn)稱gf)中g(shù)queue的特點(diǎn)。

gqueue

概念

隊(duì)列 gqueue 動(dòng)態(tài)大小的并發(fā)安全隊(duì)列

gqueue也可以設(shè)置為固定大小的隊(duì)列,固定大小時(shí)和標(biāo)準(zhǔn)庫(kù)channel沒區(qū)別。簡(jiǎn)單來(lái)說(shuō)channel實(shí)現(xiàn)的功能gqueue也能實(shí)現(xiàn)。

使用場(chǎng)景:

gqueue是并發(fā)安全的,常用于多個(gè)goroutine數(shù)據(jù)通信且支持動(dòng)態(tài)隊(duì)列大小的場(chǎng)景

代碼演示:

package main
import (
   "fmt"
   "github.com/gogf/gf/container/gqueue"
   "github.com/gogf/gf/os/gtimer"
   "time"
)

func main() {
   //實(shí)例化gqueue
   q := gqueue.New()
   //數(shù)據(jù)生產(chǎn)者 每隔1秒想隊(duì)列寫入1條數(shù)據(jù)
   gtimer.SetInterval(time.Second, func() {
      nowStr := time.Now().String()
      q.Push(nowStr)
   })

   //3秒后關(guān)閉隊(duì)列
   gtimer.SetTimeout(time.Second*3, func() {
      fmt.Println("關(guān)閉隊(duì)列")
      q.Close()
   })

   // 消費(fèi)者 不停的從隊(duì)列中取值輸出到終端中
   for {
      if v := q.Pop(); v != nil {
         fmt.Println("消費(fèi)者接收:", v)
      } else {
         break
      }
   }
}

打印結(jié)果:

優(yōu)勢(shì)

為什么不用標(biāo)準(zhǔn)庫(kù)的channel,要用gqueue呢?

  • gqueue的使用比channel更靈活,channel有隊(duì)列大小的限制,而gqueue隊(duì)列支持動(dòng)態(tài)大小
  • channel的讀寫性能確實(shí)非常高,但是channel創(chuàng)建的時(shí)候需要初始化內(nèi)存,初始化操作效率非常低;而gqueue的創(chuàng)建效率非常高,gqueue是動(dòng)態(tài)創(chuàng)建內(nèi)存。

底層實(shí)現(xiàn)

gqueue的底層實(shí)現(xiàn)是基于glist實(shí)現(xiàn)動(dòng)態(tài)大小的特性,在隊(duì)列滿或者隊(duì)列空時(shí)讀取數(shù)據(jù)會(huì)產(chǎn)生阻塞。

glist是一個(gè)并發(fā)安全的鏈接,支持關(guān)閉并發(fā)安全的特性,當(dāng)關(guān)閉并發(fā)安全的特性時(shí)和普通鏈表無(wú)異,在存儲(chǔ)和讀取數(shù)據(jù)時(shí),不會(huì)產(chǎn)生阻塞。

阻止進(jìn)程銷毀

select{}的作用可以阻止進(jìn)程銷毀

package main
import (
   "fmt"
   "github.com/gogf/gf/container/gqueue"
   "github.com/gogf/gf/os/gtime"
   "github.com/gogf/gf/os/gtimer"
   "time"
)

func main() {
   //實(shí)例化隊(duì)列
   queue := gqueue.New()
   // 生產(chǎn)者每隔1秒鐘向隊(duì)列寫入一條數(shù)據(jù)
   gtimer.SetInterval(time.Second, func() {
      queue.Push(gtime.Now().String())
   })
   //消費(fèi)者 常駐內(nèi)存一直接收生產(chǎn)者的數(shù)據(jù)
   for {
      select {
      case v := <-queue.C: //C是 chan interface{}
         if v != nil {
            fmt.Println("消費(fèi)者:", v)
         } else {
            return
         }
      }
   }
}

運(yùn)行結(jié)果:

如下圖所示,select{}可以阻止進(jìn)程銷毀,gtimer一直在生產(chǎn)數(shù)據(jù),而for循環(huán)中的select一直在消費(fèi)數(shù)據(jù)。

總結(jié)

通過(guò)這篇文章,我們知道了channel的概念和作用。也知道了gqueue的底層實(shí)現(xiàn)和特點(diǎn),以及gqueue和channel的對(duì)比。兩者各有什么特點(diǎn)。

到此這篇關(guān)于goFrame的gqueue與channe的區(qū)別的文章就介紹到這了,更多相關(guān)goFrame的gqueue內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go語(yǔ)言編譯原理之變量捕獲

    Go語(yǔ)言編譯原理之變量捕獲

    這篇文章主要為大家介紹了Go語(yǔ)言編譯原理之變量捕獲示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • 詳解go-zero如何實(shí)現(xiàn)令牌桶限流

    詳解go-zero如何實(shí)現(xiàn)令牌桶限流

    令牌桶算法既能夠?qū)⑺械恼?qǐng)求平均分布到時(shí)間區(qū)間內(nèi),又能接受服務(wù)器能夠承受范圍內(nèi)的突發(fā)請(qǐng)求,因此是目前使用較為廣泛的一種限流算法,本文就來(lái)看看go-zero如何實(shí)現(xiàn)令牌桶限流的吧
    2023-08-08
  • 在Go語(yǔ)言程序中使用gojson來(lái)解析JSON格式文件

    在Go語(yǔ)言程序中使用gojson來(lái)解析JSON格式文件

    這篇文章主要介紹了在Go語(yǔ)言程序中使用gojson來(lái)解析JSON格式文件的方法,Go是由Google開發(fā)的高人氣新興編程語(yǔ)言,需要的朋友可以參考下
    2015-10-10
  • GoFrame通用類型變量gvar與interface基本使用對(duì)比

    GoFrame通用類型變量gvar與interface基本使用對(duì)比

    這篇文章主要為大家介紹了GoFrame通用類型變量gvar與interface基本使用對(duì)比,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • go語(yǔ)言實(shí)現(xiàn)通過(guò)FTP庫(kù)自動(dòng)上傳web日志

    go語(yǔ)言實(shí)現(xiàn)通過(guò)FTP庫(kù)自動(dòng)上傳web日志

    這篇文章主要介紹了go語(yǔ)言實(shí)現(xiàn)通過(guò)FTP庫(kù)自動(dòng)上傳web日志,非常簡(jiǎn)單實(shí)用,需要的小伙伴快來(lái)參考下吧。
    2015-03-03
  • 使用go自定義prometheus的exporter

    使用go自定義prometheus的exporter

    在prometheus中如果要監(jiān)控服務(wù)器和應(yīng)用的各種指標(biāo),需要用各種各樣的exporter服務(wù),這篇文章主要介紹了使用go自定義prometheus的exporter,需要的朋友可以參考下
    2023-03-03
  • golang 如何獲取文件夾下面的文件列表

    golang 如何獲取文件夾下面的文件列表

    這篇文章主要介紹了golang 獲取文件夾下面的文件列表方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-05-05
  • golang通過(guò)遞歸遍歷生成樹狀結(jié)構(gòu)的操作

    golang通過(guò)遞歸遍歷生成樹狀結(jié)構(gòu)的操作

    這篇文章主要介紹了golang通過(guò)遞歸遍歷生成樹狀結(jié)構(gòu)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-04-04
  • golang代碼檢測(cè)工具之goimports解讀

    golang代碼檢測(cè)工具之goimports解讀

    這篇文章主要介紹了golang代碼檢測(cè)工具之goimports使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Go構(gòu)建器模式構(gòu)建復(fù)雜對(duì)象方法實(shí)例

    Go構(gòu)建器模式構(gòu)建復(fù)雜對(duì)象方法實(shí)例

    本文介紹了構(gòu)建器模式,如何通過(guò)構(gòu)建器對(duì)象構(gòu)建復(fù)雜業(yè)務(wù)對(duì)象的方法實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12

最新評(píng)論