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

grpool?goroutine池協(xié)程管理

 更新時(shí)間:2022年06月08日 10:38:39   作者:??王中陽Go????  
這篇文章主要介紹了grpool?goroutine池協(xié)程管理,goroutine協(xié)程非常輕量級,這也是為什么go支持高并發(fā),但是goroutine頻繁創(chuàng)建銷毀對GC的壓力比較大,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,需要的小伙伴可以參考一下

前言

goroutine協(xié)程非常輕量級,這也是為什么go支持高并發(fā),但是goroutine頻繁創(chuàng)建銷毀對GC的壓力比較大。

grpool的作用就是復(fù)用goroutine,減少頻繁創(chuàng)建銷毀的性能消耗。

名詞概念

Pool: goroutine池,用于管理若干可復(fù)用的goroutine協(xié)程資源

Worker: 池對象中參與任務(wù)執(zhí)行的goroutine,一個(gè)worker可以執(zhí)行若干個(gè)job,直到隊(duì)列中再無等待的job

Job:添加到池對象的任務(wù)隊(duì)列中等待執(zhí)行的任務(wù),是一個(gè)func()方法,一個(gè)job同時(shí)只能被一個(gè)worker獲取并執(zhí)行。

使用示例

使用默認(rèn)的協(xié)程池,限制100個(gè)協(xié)程執(zhí)行1000個(gè)任務(wù)

pool.Size() 獲得當(dāng)前工作的協(xié)程數(shù)量

pool.Jobs() 獲得當(dāng)前池中待處理的任務(wù)數(shù)量

package main
import (
   "fmt"
   "github.com/gogf/gf/os/grpool"
   "github.com/gogf/gf/os/gtimer"
   "sync"
   "time"
)
func main() {
   pool := grpool.New(100)
   //添加1千個(gè)任務(wù)
   for i := 0; i < 1000; i++ {
      _ = pool.Add(job)
   }
   fmt.Println("worker:", pool.Size()) //當(dāng)前工作的協(xié)程數(shù)量
   fmt.Println("jobs:", pool.Jobs())   //當(dāng)前池中待處理的任務(wù)數(shù)量

   gtimer.SetInterval(time.Second, func() {
      fmt.Println("worker:", pool.Size()) //當(dāng)前工作的協(xié)程數(shù)
      fmt.Println("jobs:", pool.Jobs())   //當(dāng)前池中待處理的任務(wù)數(shù)
   })
   //阻止進(jìn)程結(jié)束
   select {}
}
//任務(wù)方法
func job() {
   time.Sleep(time.Second)
}

打印結(jié)果:

是不是灰常簡單~

踩坑之旅

一個(gè)簡單的場景,請使用協(xié)程打印0~9。

常犯的錯(cuò)誤

大家看下面的代碼有沒有問題,請預(yù)測一下打印結(jié)果。

wg := sync.WaitGroup{}
for i := 0; i < 9; i++ {
   wg.Add(1)
   go func() {
      fmt.Println(i)
      wg.Done()
   }()
}
wg.Wait()

不用著急看答案

猜一下打印結(jié)果是什么

打印結(jié)果:

分析原因

對于異步線程/協(xié)程來講,函數(shù)進(jìn)行異步執(zhí)行注冊時(shí),該函數(shù)并未真正開始執(zhí)行(注冊時(shí)只在goroutine的棧中保存了變量i的內(nèi)存地址),而一旦開始執(zhí)行時(shí)函數(shù)才會(huì)去讀取變量i的值,而這個(gè)時(shí)候變量i的值已經(jīng)自增到了9。

正確寫法:

wg := sync.WaitGroup{}
for i := 0; i < 9; i++ {
   wg.Add(1)
   go func(v int) {
      fmt.Println(v)
      wg.Done()
   }(i)
}
wg.Wait()

打印結(jié)果:

使用grpool

使用grpool和使用go一樣,都需要把當(dāng)前變量i的值賦值給一個(gè)不會(huì)改變的臨時(shí)變量,在函數(shù)中使用該臨時(shí)變量而不是直接使用變量i。

錯(cuò)誤代碼

wg := sync.WaitGroup{}
for i := 0; i < 9; i++ {
   wg.Add(1)
   _ = grpool.Add(func() {
      fmt.Println(i) //打印結(jié)果都是9
      wg.Done()
   })
}
wg.Wait()

打印結(jié)果:

正確代碼

wg := sync.WaitGroup{}
for i := 0; i < 9; i++ {
   wg.Add(1)
   v := i //grpoll.add() 的參數(shù)只能是不帶參數(shù)的匿名函數(shù) 因此只能以設(shè)置臨時(shí)變量的方式賦值
   _ = grpool.Add(func() {
      fmt.Println(v)
      wg.Done()
   })
}
wg.Wait()

打印結(jié)果:

總結(jié)

通過這篇文章我們了解到:grpool的作用就是復(fù)用goroutine,減少頻繁創(chuàng)建銷毀的性能消耗。也了解到使用協(xié)程容易犯的錯(cuò)誤,以及用臨時(shí)變量的方式來解決問題。

說句題外話:grpool的基礎(chǔ)概念:Pool、Worke、Job 和我之前設(shè)計(jì)的派單系統(tǒng)簡直一模一樣。

到此這篇關(guān)于grpool goroutine池協(xié)程管理的文章就介紹到這了,更多相關(guān)grpool goroutine池 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • golang中sync.Map并發(fā)創(chuàng)建、讀取問題實(shí)戰(zhàn)記錄

    golang中sync.Map并發(fā)創(chuàng)建、讀取問題實(shí)戰(zhàn)記錄

    這篇文章主要給大家介紹了關(guān)于golang中sync.Map并發(fā)創(chuàng)建、讀取問題的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-07-07
  • Go的os/exec執(zhí)行超時(shí)導(dǎo)致程序死機(jī)的解決方案

    Go的os/exec執(zhí)行超時(shí)導(dǎo)致程序死機(jī)的解決方案

    這篇文章主要介紹了Go的os/exec執(zhí)行超時(shí)導(dǎo)致程序死機(jī)的幾種解決方案,文中通過代碼示例給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-04-04
  • Go標(biāo)準(zhǔn)庫之Requests的介紹與基本使用

    Go標(biāo)準(zhǔn)庫之Requests的介紹與基本使用

    Python中的Requests庫非常強(qiáng)大,所以Go開發(fā)者模仿Python的Requests庫,由此誕生了Grequests庫,本文主要介紹了Requests的基本使用,有需要的可以參考下
    2024-04-04
  • Go 語言中的 http.FileSystem詳細(xì)解析

    Go 語言中的 http.FileSystem詳細(xì)解析

    在本文中,我們深入探討了 Go 語言中的 http.FileSystem 接口,并介紹了它的基本原理、使用方法以及實(shí)際應(yīng)用場景,感興趣的朋友跟隨小編一起看看吧
    2024-03-03
  • Go語言函數(shù)學(xué)習(xí)教程

    Go語言函數(shù)學(xué)習(xí)教程

    這篇文章主要介紹了Go語言函數(shù)基本用法,結(jié)合實(shí)例形式分析了Go語言函數(shù)的格式、定義、使用方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2016-07-07
  • golang進(jìn)行簡單權(quán)限認(rèn)證的實(shí)現(xiàn)

    golang進(jìn)行簡單權(quán)限認(rèn)證的實(shí)現(xiàn)

    本文主要介紹了golang簡單權(quán)限認(rèn)證的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Go疑難雜癥講解之為什么nil不等于nil

    Go疑難雜癥講解之為什么nil不等于nil

    在日常開發(fā)中,可能一不小心就會(huì)掉進(jìn)?Go?語言的某些陷阱里,而本文要介紹的?nil?≠?nil?問題,感興趣的小伙伴可以跟隨小編一起了解一下
    2022-10-10
  • 用gomock進(jìn)行mock測試的方法示例

    用gomock進(jìn)行mock測試的方法示例

    go-mock是專門為go語言開發(fā)的mock庫,該庫使用方式簡單,支持自動(dòng)生成代碼,這篇文章主要介紹了用gomock進(jìn)行mock測試的方法示例,感興趣的小伙伴們可以參考一下
    2018-11-11
  • golang中獲取變量類型的方法總結(jié)

    golang中獲取變量類型的方法總結(jié)

    golang中是沒有提供內(nèi)置函數(shù)來獲取變量的類型的,但是通過一定的方式也可以獲取,下面主要給大家介紹了幾個(gè)golang獲取變量類型的幾種方式,需要的朋友可以參考下
    2025-03-03
  • go?doudou開發(fā)gRPC服務(wù)快速上手實(shí)現(xiàn)詳解

    go?doudou開發(fā)gRPC服務(wù)快速上手實(shí)現(xiàn)詳解

    這篇文章主要為大家介紹了go?doudou開發(fā)gRPC服務(wù)快速上手實(shí)現(xiàn)過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12

最新評論

宜川县| 精河县| 磐石市| 黄山市| 大名县| 柏乡县| 长子县| 宜黄县| 古交市| 宝清县| 陕西省| 平阳县| 仲巴县| 石柱| 思南县| 来宾市| 浏阳市| 招远市| 陇南市| 扎赉特旗| 凤翔县| 黑河市| 东安县| 教育| 高州市| 齐齐哈尔市| 广东省| 灵璧县| 大英县| 丰宁| 石台县| 九江市| 万源市| 常德市| 海盐县| 建德市| 柘城县| 宜宾县| 晋宁县| 布拖县| 资源县|