最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

goFrame的隊列g(shù)queue對比channel使用詳解

 更新時間:2022年06月09日 17:32:30   作者:王中陽Go  
這篇文章主要為大家介紹了goFrame的gqueue對比channel使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

channel

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

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

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

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

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

在搞清楚channel的作用之后我們再來研究GoFrame框架(下文簡稱gf)中g(shù)queue的特點。

gqueue

概念

隊列 gqueue 動態(tài)大小的并發(fā)安全隊列

gqueue也可以設(shè)置為固定大小的隊列,固定大小時和標(biāo)準(zhǔn)庫channel沒區(qū)別。

簡單來說channel實現(xiàn)的功能gqueue也能實現(xiàn)。

使用場景:

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

代碼演示

package main
import (
   "fmt"
   "github.com/gogf/gf/container/gqueue"
   "github.com/gogf/gf/os/gtimer"
   "time"
)
func main() {
   //實例化gqueue
   q := gqueue.New()
   //數(shù)據(jù)生產(chǎn)者 每隔1秒想隊列寫入1條數(shù)據(jù)
   gtimer.SetInterval(time.Second, func() {
      nowStr := time.Now().String()
      q.Push(nowStr)
   })
   //3秒后關(guān)閉隊列
   gtimer.SetTimeout(time.Second*3, func() {
      fmt.Println("關(guān)閉隊列")
      q.Close()
   })
   // 消費者 不停的從隊列中取值輸出到終端中
   for {
      if v := q.Pop(); v != nil {
         fmt.Println("消費者接收:", v)
      } else {
         break
      }
   }
}
復(fù)制代碼

打印結(jié)果

優(yōu)勢

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

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

底層實現(xiàn)

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

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

阻止進程銷毀

select{}的作用可以阻止進程銷毀

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

運行結(jié)果

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

總結(jié)

以上就是goFrame的gqueue對比channel使用詳解的詳細內(nèi)容,通過這篇文章,我們知道了channel的概念和作用。也知道了gqueue的底層實現(xiàn)和特點,以及gqueue和channel的對比。兩者各有什么特點,更多關(guān)于goFrame gqueue對比channel的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Go結(jié)構(gòu)體從基礎(chǔ)到應(yīng)用深度探索

    Go結(jié)構(gòu)體從基礎(chǔ)到應(yīng)用深度探索

    本文深入探討了結(jié)構(gòu)體的定義、類型、字面量表示和使用方法,旨在為讀者呈現(xiàn)Go結(jié)構(gòu)體的全面視角,通過結(jié)構(gòu)體,開發(fā)者可以實現(xiàn)更加模塊化、高效的代碼設(shè)計,這篇文章旨在為您提供關(guān)于結(jié)構(gòu)體的深入理解,助您更好地利用Go語言的強大功能
    2023-10-10
  • Go語言中defer使用的陷阱小結(jié)

    Go語言中defer使用的陷阱小結(jié)

    本文主要介紹了Go語言中defer使用的陷阱小結(jié),分別是defer語句不可以在return語句之后,defer語句執(zhí)行的匿名函數(shù),匿名函數(shù)的參數(shù)會被預(yù)先處理,具有一定的參考價值,感興趣的可以了解一下
    2024-01-01
  • 詳解Go函數(shù)和方法之間有什么區(qū)別

    詳解Go函數(shù)和方法之間有什么區(qū)別

    這篇文章就簡單和大家聊一聊在Go中函數(shù)與方法之間的區(qū)別,文章通過代碼示例介紹的非常詳細,對我們的學(xué)習(xí)或工作有一定的幫助,感興趣的小伙伴跟著小編一起來看看吧
    2023-07-07
  • 最新評論

    榆社县| 鹤岗市| 科技| 岢岚县| 曲周县| 兴义市| 东莞市| 兴国县| 万山特区| 长泰县| 涿鹿县| 安阳县| 梓潼县| 楚雄市| 盐池县| 南木林县| 边坝县| 新乡县| 云和县| 泰来县| 浑源县| 同德县| 台山市| 竹溪县| 视频| 微山县| 隆德县| 彭泽县| 宝鸡市| 孟津县| 平邑县| 甘孜县| 齐齐哈尔市| 福州市| 嘉义县| 清水河县| 平陆县| 梁山县| 福建省| 信宜市| 靖西县|