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

Golang協(xié)程池的實現(xiàn)與應用

 更新時間:2023年05月11日 10:29:43   作者:未來誰可知  
這篇文章主要介紹了Golang協(xié)程池的實現(xiàn)與應用,使用協(xié)程池的好處是減少在創(chuàng)建和銷毀協(xié)程上所花的時間以及資源的開銷,解決資源不足的問題,需要詳細了解可以參考下文

1. 為什么需要協(xié)程池

使用協(xié)程池的好處是減少在創(chuàng)建和銷毀協(xié)程上所花的時間以及資源的開銷,解決資源不足的問題。如果不使用協(xié)程池,有可能造成系統(tǒng)創(chuàng)建大量同類協(xié)程池而導致消耗完內存或者內存泄漏的問題。

2. 使用協(xié)程池的優(yōu)點

  • 不用手動頻繁的創(chuàng)建協(xié)程了
  • 方便統(tǒng)一管理,只用管理池子就行了
  • 提高響應速度,一有任務如果有剛執(zhí)行完的協(xié)程就能馬上去執(zhí)行新任務

3. 設計思路

Task 任務對象->EntryChannel->JobsChannel <-Pool(worker)

4. 實現(xiàn)一個簡單的協(xié)程池

4.1 Task 任務對象

type Task struct {
   // Task方法 任務
   method func() error
   // 可以擴展
}
// NewTask 創(chuàng)建一個Task
func NewTask(method func() error) *Task {
   return &Task{
      method: method,
   }
}
// Execute 任務執(zhí)行
func (t *Task) Execute() {
   err := t.method()
   if err != nil {
      panic(err)
   }
}

4.2 Pool協(xié)程池

// 定義一個協(xié)程池
type Pool struct {
   // 對外的Task入口
   EntryChannel chan *Task
   // 對內的Task隊列
   JobsChannel chan *Task
   // 協(xié)程池的最大work數(shù)量
   WorkerNum int
}
// NewPool 創(chuàng)建Pool的函數(shù)
func NewPool(cap int) *Pool{
   return &Pool{
      EntryChannel: make(chan *Task),
      JobsChannel: make(chan *Task),
      WorkerNum: cap,
   }
}
// 協(xié)程池創(chuàng)建一個Worker
func (p *Pool)worker(workID int){
   for task:=range p.JobsChannel{
        task.Execute()  //取到任務就執(zhí)行
      fmt.Println("worker_id 為",workID)
   }
}
// 讓協(xié)程池開始真正的工作
func (p *Pool)run() {
   // 根據(jù)創(chuàng)建協(xié)程池的大小來創(chuàng)建協(xié)程工作
   for i := 0; i < p.WorkerNum; i++ {
      go p.worker(i+1)
   }
   // 不斷遍歷外部的任務然后丟入到內部的隊列去運行
   for task := range p.EntryChannel {
          p.JobsChannel<-task
   }
}

4.3 Main函數(shù)

// 主函數(shù) 測試
func main(){
   // 創(chuàng)建一些任務
   task:=NewTask(PrintTimeNow)
   // 創(chuàng)建協(xié)程池
   pool:=NewPool(4)
   taskNum:=0
   go func(taskNum int) {
      for{
         // 不斷的向池子里寫入任務task,任務主要是打印當前時間
         pool.EntryChannel<-task
         // atomic.AddInt32(&taskNum,1)
         taskNum+=1
         fmt.Println("當前一共執(zhí)行了",taskNum,"個任務")
      }
   }(taskNum)
   pool.run()
}
// 業(yè)務邏輯
func PrintTimeNow()( err error){
   fmt.Println(time.Now())
   return
}

到此這篇關于Golang協(xié)程池的實現(xiàn)與應用的文章就介紹到這了,更多相關Go協(xié)程池內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Golang設計模式之原型模式詳細講解

    Golang設計模式之原型模式詳細講解

    如果一個類的有非常多的屬性,層級還很深。每次構造起來,不管是直接構造還是用建造者模式,都要對太多屬性進行復制,那么有沒有一種好的方式讓我們創(chuàng)建太的時候使用體驗更好一點呢? 今天的文章里就給大家介紹一種設計模式,來解決這個問題
    2023-01-01
  • 一文帶你了解Go語言標準庫strings的常用函數(shù)和方法

    一文帶你了解Go語言標準庫strings的常用函數(shù)和方法

    strings?庫包含了許多高效的字符串常用操作的函數(shù)和方法,巧用這些函數(shù)與方法,能極大的提高我們程序的性能。本文就來和大家分享一下Go標準庫strings的常用函數(shù)和方法,希望對大家有所幫助
    2022-11-11
  • Go單體服務開發(fā)最佳實踐總結

    Go單體服務開發(fā)最佳實踐總結

    這篇文章主要介紹了Go單體服務開發(fā)最佳實踐,通過本文詳細跟大家分享一下如何使用?go-zero?快速開發(fā)一個有多個模塊的單體服務,需要的朋友可以參考下
    2022-04-04
  • Go 類型轉換工具包strconv包的用法

    Go 類型轉換工具包strconv包的用法

    Go 語言的?strconv?包提供了用于基本數(shù)據(jù)類型之間轉換的函數(shù),本文主要介紹了Go 類型轉換工具包strconv包的用法,具有一定的參考價值,感興趣的可以了解一下
    2024-05-05
  • Go語言WaitGroup使用時需要注意的坑

    Go語言WaitGroup使用時需要注意的坑

    Go語言中WaitGroup的用途是它能夠一直等到所有的goroutine執(zhí)行完成,并且阻塞主線程的執(zhí)行,直到所有的goroutine執(zhí)行完成。之前一直使用也沒有問題,但最近通過同事的一段代碼引起了關于WaitGroup的注意,下面這篇文章就介紹了WaitGroup使用時需要注意的坑及填坑。
    2016-12-12
  • Golang中Map按照Value大小排序的方法實例

    Golang中Map按照Value大小排序的方法實例

    這篇文章主要給大家介紹了關于Golang中Map按照Value大小排序的相關資料,文中通過實例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2022-03-03
  • 使用Golang實現(xiàn)Sm2加解密的代碼詳解

    使用Golang實現(xiàn)Sm2加解密的代碼詳解

    本文主要介紹了Go語言實現(xiàn)Sm2加解密的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-03-03
  • Go語言對字符串進行MD5加密的方法

    Go語言對字符串進行MD5加密的方法

    這篇文章主要介紹了Go語言對字符串進行MD5加密的方法,實例分析了Go語言對字符串進行md5加密的技巧,需要的朋友可以參考下
    2015-03-03
  • Go語言聲明一個多行字符串的變量

    Go語言聲明一個多行字符串的變量

    這篇文章主要介紹了Go語言聲明一個多行字符串的變量的方法和示例,非常簡單實用,有需要的小伙伴可以參考下。
    2015-04-04
  • Go語言kylin任務自動化實例詳解

    Go語言kylin任務自動化實例詳解

    這篇文章主要為大家介紹了Go語言kylin任務自動化實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06

最新評論