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ù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
一文帶你了解Go語言標準庫strings的常用函數(shù)和方法
strings?庫包含了許多高效的字符串常用操作的函數(shù)和方法,巧用這些函數(shù)與方法,能極大的提高我們程序的性能。本文就來和大家分享一下Go標準庫strings的常用函數(shù)和方法,希望對大家有所幫助2022-11-11