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

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

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

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ā)哲學,銘記這句原則:用通信來共享內(nèi)存,而不要用共享內(nèi)存來通信。

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

gqueue

概念

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

gqueue也可以設(shè)置為固定大小的隊列,固定大小時和標準庫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
      }
   }
}

打印結(jié)果:

優(yōu)勢

為什么不用標準庫的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ā)安全的特性,當關(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
         }
      }
   }
}

運行結(jié)果:

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

總結(jié)

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

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

相關(guān)文章

  • Golang如何自定義logrus日志保存為日志文件

    Golang如何自定義logrus日志保存為日志文件

    這篇文章主要給大家介紹了關(guān)于Golang如何自定義logrus日志保存為日志文件的相關(guān)資料,logrus是目前Github上star數(shù)量最多的日志庫,logrus功能強大,性能高效,而且具有高度靈活性,提供了自定義插件的功能,很多開源項目都是用了logrus來記錄其日志,需要的朋友可以參考下
    2024-02-02
  • golang xorm及time.Time自定義解決json日期格式的問題

    golang xorm及time.Time自定義解決json日期格式的問題

    這篇文章主要介紹了golang xorm及time.Time自定義解決json日期格式的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • go語言實現(xiàn)處理表單輸入

    go語言實現(xiàn)處理表單輸入

    本文給大家分享的是一個使用go語言實現(xiàn)處理表單輸入的實例代碼,非常的簡單,僅僅是實現(xiàn)了用戶名密碼的驗證,有需要的小伙伴可以自由擴展下。
    2015-03-03
  • Go中使用加密算法的方法

    Go中使用加密算法的方法

    本文通過實例代碼給大家介紹go中使用加密算法的方法,代碼簡單易懂,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2021-08-08
  • golang調(diào)用c實現(xiàn)的dll接口細節(jié)分享

    golang調(diào)用c實現(xiàn)的dll接口細節(jié)分享

    這篇文章主要介紹了golang調(diào)用c實現(xiàn)的dll接口細節(jié)分享,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • Go條件控制語句詳解(if-else、switch和select)

    Go條件控制語句詳解(if-else、switch和select)

    條件語句用于檢查一個條件是否為真,并根據(jù)條件的真假來決定是否執(zhí)行相應(yīng)的代碼,下面這篇文章主要給大家介紹了關(guān)于Go條件控制語句(if-else、switch和select)的相關(guān)資料,需要的朋友可以參考下
    2024-03-03
  • Go語言io?pipe源碼分析詳情

    Go語言io?pipe源碼分析詳情

    這篇文章主要介紹了Go語言io?pipe源碼分析詳情,pipe是一個適配器,用于連接Reader和Writer,pipe的方法不多,新的寫法卻不少,并且結(jié)構(gòu)體分兩塊,讀寫信道和結(jié)束標識,下面進入文章了解具體的內(nèi)容吧
    2022-02-02
  • go?map搬遷的實現(xiàn)

    go?map搬遷的實現(xiàn)

    本文主要介紹了go?map搬遷的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04
  • Go語言并發(fā)之Select多路選擇操作符用法詳解

    Go語言并發(fā)之Select多路選擇操作符用法詳解

    Go?語言借用多路復用的概念,提供了?select?關(guān)鍵字,用于多路監(jiān)聽多個通道,本文就來和大家聊聊Go語言中Select多路選擇操作符的具體用法,希望對大家有所幫助
    2023-06-06
  • 詳解go如何使用xorm在執(zhí)行前改寫?SQL

    詳解go如何使用xorm在執(zhí)行前改寫?SQL

    這篇文章主要為大家介紹了詳解go如何使用xorm在執(zhí)行前改寫SQL的實現(xiàn)過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-06-06

最新評論

邵武市| 宁陵县| 大城县| 华坪县| 黔西县| 桂林市| 浦县| 中牟县| 兴和县| 太谷县| 山丹县| 青铜峡市| 忻州市| 汉阴县| 夏邑县| 唐山市| 上高县| 金阳县| 门源| 山西省| 安国市| 萝北县| 神农架林区| 天长市| 武陟县| 余江县| 宁明县| 神农架林区| 浠水县| 浦县| 犍为县| 荣成市| 大城县| 汉川市| 阿拉善盟| 阜平县| 昌乐县| 炉霍县| 潍坊市| 宁南县| 阿克陶县|