能看到這篇文章一定是特殊的緣分,請務必珍惜,請詳細看看吧,哈哈。
圖片
不止上圖,最近 Go就業訓練營 中不少小伙伴說,面試中碰到了好幾次讓手撕協程池的公司。
通過以上的解題思路,我們可以實現一個基本的協程池。
在實際應用中,可能還需要考慮一些其他的因素,如任務優先級、任務超時處理等。根據具體的需求,可以對協程池進行進一步的擴展和優化。
說完了解題思路,再給大家一個可參考,可運行的示例代碼:
package mainimport ( "fmt" "sync")type Job struct { ID int}type Worker struct { ID int JobChannel chan Job Quit chan bool}type Pool struct { WorkerNum int JobChannel chan Job WorkerQueue chan chan Job Quit chan bool wg sync.WaitGroup}// NewWorker 創建一個新的工作者func NewWorker(id int, workerQueue chan chan Job) Worker { return Worker{ ID: id, JobChannel: make(chan Job), Quit: make(chan bool), }}// Start 啟動工作者func (w Worker) Start(workerQueue chan chan Job) { go func() { for { workerQueue <- w.JobChannel select { case job := <-w.JobChannel: fmt.Printf("Worker %d started job %d/n", w.ID, job.ID) // 執行任務 fmt.Printf("Worker %d finished job %d/n", w.ID, job.ID) case <-w.Quit: return } } }()}// Start 啟動工作者池func (p *Pool) Start() { for i := 0; i < p.WorkerNum; i++ { worker := NewWorker(i, p.WorkerQueue) worker.Start(p.WorkerQueue) } go func() { for { select { case job := <-p.JobChannel: worker := <-p.WorkerQueue worker <- job case <-p.Quit: for i := 0; i < p.WorkerNum; i++ { worker := <-p.WorkerQueue worker <- Job{} // 發送空任務,通知協程退出 } p.wg.Done() return } } }()}// AddJob 添加作業到作業通道func (p *Pool) AddJob(job Job) { p.JobChannel <- job}// Stop 停止工作者池func (p *Pool) Stop() { p.Quit <- true p.wg.Wait()}func main() { pool := Pool{ WorkerNum: 5, JobChannel: make(chan Job), WorkerQueue: make(chan chan Job, 5), Quit: make(chan bool), } pool.Start() for i := 0; i < 10; i++ { job := Job{ID: i} pool.AddJob(job) } pool.Stop()}
以下是對代碼的注釋:
有小伙伴提出了疑問:
WorkerQueue chan chan Job 的作用是什么?為什么要這么定義?
WorkerQueue chan chan Job 的作用是用于傳遞工作者(Worker)的作業通道(JobChannel)。它是一個通道(channel),其中每個元素都是一個作業通道。
為什么要這么定義呢?這是因為在工作者池模式中,每個工作者需要一個獨立的作業通道來接收作業。通過將每個工作者的作業通道放入一個通道中,可以實現對工作者的動態分配和管理。
具體來說,WorkerQueue 通道用于存儲每個工作者的作業通道。當有新的作業到達時,工作者池會從 WorkerQueue 中取出一個可用的工作者的作業通道,并將作業發送到該通道中,由相應的工作者進行處理。
這種設計可以有效地控制并發任務的分配和調度。通過將工作者的作業通道放入 WorkerQueue 中,可以實現對工作者的復用和動態管理,避免了頻繁地創建和銷毀工作者協程的開銷。
總結起來,WorkerQueue 的定義允許工作者池動態地管理工作者的作業通道,實現對并發任務的高效分配和調度。
圖片
以上代碼實現了一個簡單的工作池(Worker Pool)模式。工作池由一組固定數量的工作者(Worker)協程組成,它們從作業通道(JobChannel)中獲取作業(Job)并執行。
本文轉載自微信公眾號「 程序員升級打怪之旅」,作者「 王中陽Go」,可以通過以下二維碼關注。
轉載本文請聯系「 程序員升級打怪之旅」公眾號。
本文鏈接:http://www.www897cc.com/showinfo-26-34655-0.html不少人面試都掛在這道題了!你掛了嗎?
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com
上一篇: 新一代WebFlux框架核心技術Reactor響應式編程基本用法
下一篇: 一個注解搞定多數據源切換,你學會了嗎?