亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

前言

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

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

名詞概念

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

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

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

使用示例

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

pool.Size() 獲得當前工作的協(xié)程數量

pool.Jobs() 獲得當前池中待處理的任務數量

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千個任務
   for i := 0; i < 1000; i++ {
      _ = pool.Add(job)
   }
   fmt.Println("worker:", pool.Size()) //當前工作的協(xié)程數量
   fmt.Println("jobs:", pool.Jobs())   //當前池中待處理的任務數量

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

打印結果:

是不是灰常簡單~

踩坑之旅

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

常犯的錯誤

大家看下面的代碼有沒有問題,請預測一下打印結果。

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

不用著急看答案

猜一下打印結果是什么

打印結果:

分析原因

對于異步線程/協(xié)程來講,函數進行異步執(zhí)行注冊時,該函數并未真正開始執(zhí)行(注冊時只在goroutine的棧中保存了變量i的內存地址),而一旦開始執(zhí)行時函數才會去讀取變量i的值,而這個時候變量i的值已經自增到了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()

打印結果:

使用grpool

使用grpool和使用go一樣,都需要把當前變量i的值賦值給一個不會改變的臨時變量,在函數中使用該臨時變量而不是直接使用變量i。

錯誤代碼

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

打印結果:

正確代碼

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

打印結果:

總結

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

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

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

相關文章

  • golang時間及時間戳的獲取轉換

    golang時間及時間戳的獲取轉換

    本文主要介紹了golang時間及時間戳的獲取轉換,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-06-06
  • Golang Map實現賦值和擴容的示例代碼

    Golang Map實現賦值和擴容的示例代碼

    這篇文章主要介紹了Golang Map實現賦值和擴容的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-04-04
  • golang敏感詞過濾的實現

    golang敏感詞過濾的實現

    本文主要介紹了golang敏感詞過濾的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-01-01
  • Goland IDEA項目多開設置方式

    Goland IDEA項目多開設置方式

    這篇文章主要介紹了Goland IDEA項目多開設置方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • golang之資源釋放/異常錯誤處理解析

    golang之資源釋放/異常錯誤處理解析

    這篇文章主要為大家介紹了golang之資源釋放/異常錯誤處理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01
  • golang接口實現調用修改(值接收者指針接收者)場景詳解

    golang接口實現調用修改(值接收者指針接收者)場景詳解

    這篇文章主要為大家介紹了golang接口實現調用修改值接收者指針接收者示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • go grpc安裝使用教程

    go grpc安裝使用教程

    gRPC是由Google主導開發(fā)的RPC框架,使用HTTP/2協(xié)議并用ProtoBuf作為序列化工具。這篇文章主要介紹了go grpc安裝使用教程,需要的朋友可以參考下
    2018-02-02
  • 深入探索Go?1.21中的?maps工具庫

    深入探索Go?1.21中的?maps工具庫

    隨著?Go?1.21.0?版本的發(fā)布,新增了兩個實用的泛型工具庫:maps?和?slices,下面小編就帶大家一起學習一下?maps?工具庫的相關知識吧
    2023-08-08
  • go代碼實現買房貸款月供計算的方法

    go代碼實現買房貸款月供計算的方法

    今天小編就為大家分享一篇關于go代碼實現買房貸款月供計算的方法,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • Fedora14 Linux系統(tǒng)安裝Golang開發(fā)環(huán)境筆記

    Fedora14 Linux系統(tǒng)安裝Golang開發(fā)環(huán)境筆記

    這篇文章主要介紹了Fedora14 Linux系統(tǒng)安裝Golang開發(fā)環(huán)境筆記,本文講解了2種安裝方法,需要的朋友可以參考下
    2014-10-10

最新評論