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

Golang協(xié)程池的實(shí)現(xiàn)與應(yīng)用

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

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

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

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

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

3. 設(shè)計(jì)思路

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

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

4.1 Task 任務(wù)對象

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

4.2 Pool協(xié)程池

// 定義一個(gè)協(xié)程池
type Pool struct {
   // 對外的Task入口
   EntryChannel chan *Task
   // 對內(nèi)的Task隊(duì)列
   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)建一個(gè)Worker
func (p *Pool)worker(workID int){
   for task:=range p.JobsChannel{
        task.Execute()  //取到任務(wù)就執(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)
   }
   // 不斷遍歷外部的任務(wù)然后丟入到內(nèi)部的隊(duì)列去運(yùn)行
   for task := range p.EntryChannel {
          p.JobsChannel<-task
   }
}

4.3 Main函數(shù)

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

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

相關(guān)文章

  • Golang 并發(fā)讀寫鎖的具體實(shí)現(xiàn)

    Golang 并發(fā)讀寫鎖的具體實(shí)現(xiàn)

    Go語言中的sync.RWMutex提供了讀寫鎖機(jī)制,允許多個(gè)協(xié)程并發(fā)讀取共享資源,但在寫操作時(shí)保持獨(dú)占性,本文主要介紹了Golang 并發(fā)讀寫鎖的具體實(shí)現(xiàn),感興趣的可以了解一下
    2025-02-02
  • Go語言什么時(shí)候該使用指針

    Go語言什么時(shí)候該使用指針

    本文主要介紹了Go語言什么情況下應(yīng)該使用指針,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • 使用Go創(chuàng)建一個(gè)TCP服務(wù)器的操作步驟

    使用Go創(chuàng)建一個(gè)TCP服務(wù)器的操作步驟

    在網(wǎng)絡(luò)編程中,TCP?是最常見的傳輸協(xié)議之一,Go?提供了?net?包,可以方便地實(shí)現(xiàn)?TCP?服務(wù)器與客戶端通信,本篇將以實(shí)戰(zhàn)形式演示如何用?Go?創(chuàng)建一個(gè)?TCP?服務(wù)器,并讓多個(gè)客戶端與之通信,需要的朋友可以參考下
    2025-08-08
  • 簡單聊聊為什么說Go語言字符串是不可變的

    簡單聊聊為什么說Go語言字符串是不可變的

    最近有讀者留言說,平時(shí)在寫代碼的過程中,是會(huì)對字符串進(jìn)行修改的,但網(wǎng)上都說 Go 語言字符串是不可變的,這是為什么呢,本文就來和大家簡單講講
    2023-05-05
  • go語言LeetCode題解944刪列造序示例詳解

    go語言LeetCode題解944刪列造序示例詳解

    這篇文章主要為大家介紹了go語言LeetCode題解944刪列造序示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • Go打印結(jié)構(gòu)體提升代碼調(diào)試效率實(shí)例詳解

    Go打印結(jié)構(gòu)體提升代碼調(diào)試效率實(shí)例詳解

    這篇文章主要介紹了Go打印結(jié)構(gòu)體提升代碼調(diào)試效率實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-02-02
  • Golang 語言控制并發(fā) Goroutine的方法

    Golang 語言控制并發(fā) Goroutine的方法

    本文我們介紹了不同場景中分別適合哪種控制并發(fā) goroutine 的方式,其中,channel 適合控制少量 并發(fā) goroutine,WaitGroup 適合控制一組并發(fā) goroutine,而 context 適合控制多級并發(fā) goroutine,感興趣的朋友跟隨小編一起看看吧
    2021-06-06
  • go語言LeetCode題解720詞典中最長的單詞

    go語言LeetCode題解720詞典中最長的單詞

    這篇文章主要為大家介紹了go語言LeetCode題解720詞典中最長的單詞,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • go mod私有倉庫配置小結(jié)

    go mod私有倉庫配置小結(jié)

    Go語言私有倉庫通常指的是那些不在公共倉庫如GitHub上的倉庫,本文主要介紹了go mod私有倉庫配置,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-03-03
  • Go語言map不支持并發(fā)寫操作的原因

    Go語言map不支持并發(fā)寫操作的原因

    Go語言為什么不支持并發(fā)讀寫map?,Go官方的說法是在多數(shù)情況下map只存在并發(fā)讀操作,如果原生支持并發(fā)讀寫,即降低了并發(fā)讀操作的性能,在使用?map?時(shí),要特別注意是否存在對?map?的并發(fā)寫操作,如果存在,要結(jié)合?sync?包的互斥鎖一起使用,
    2024-01-01

最新評論