GO workPool的線程池實現
Go語言中的線程池是一種用于管理并發(fā)執(zhí)行任務的設計模式。
線程池的主要目的是減少創(chuàng)建和銷毀線程的開銷,提高系統(tǒng)性能。 在Go語言中,線程池通常使用goroutine和channel來實現。
以下是一個簡單的Go線程池實現:
package main import ( "fmt" "sync" ) type Job func() type Worker struct { JobQueue chan Job } func NewWorker() Worker { return Worker{JobQueue: make(chan Job)} } func (w Worker) Run(wg *sync.WaitGroup) { go func() { for job := range w.JobQueue { job() wg.Done() } }() } type Pool struct { JobQueue chan Job WorkerQueue chan chan Job } func NewPool(maxWorkers int) *Pool { workerQueue := make(chan chan Job, maxWorkers) jobQueue := make(chan Job) return &Pool{JobQueue: jobQueue, WorkerQueue: workerQueue} } func (p *Pool) Run() { for i := 0; i < cap(p.WorkerQueue); i++ { worker := NewWorker() worker.Run(&sync.WaitGroup{}) p.WorkerQueue <- worker.JobQueue } go func() { for job := range p.JobQueue { workerJobQueue := <-p.WorkerQueue workerJobQueue <- job } }() } func main() { pool := NewPool(5) pool.Run() wg := sync.WaitGroup{} wg.Add(10) for i := 0; i < 10; i++ { job := func() { fmt.Println("Executing job") } pool.JobQueue <- job } wg.Wait() }
說明
在這個例子中,我們創(chuàng)建了 Worker結構體,它包含一個JobQueue通道,用于接收任務。 NewWorker函數用于創(chuàng)建一個新的Worker實例。 Run方法啟動一個goroutine,監(jiān)聽JobQueue通道,當有任務到來時,執(zhí)行任務并通知WaitGroup。
Pool結構體包含一個JobQueue通道和一個WorkerQueue通道。 JobQueue用于接收任務,WorkerQueue用于存儲空閑的Worker。 NewPool函數用于創(chuàng)建一個新的Pool實例。 Run方法啟動指定數量的 Worker并將它們添加到 WorkerQueue中。然后啟動一個goroutine,監(jiān)聽 JobQueue通道,當有任務到來時,從 WorkerQueue中取出一個空閑的 Worker,將任務分配給它。
在main函數中,我們創(chuàng)建一個包含5個Worker的線程池,并向線程池提交10個任務。 使用WaitGroup來等待所有任務完成。
小結有需要的小伙伴可以加以修改使用
到此這篇關于GO workPool的線程池實現的文章就介紹到這了,更多相關GO workPool線程池內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Go語言服務器開發(fā)之簡易TCP客戶端與服務端實現方法
這篇文章主要介紹了Go語言服務器開發(fā)之簡易TCP客戶端與服務端實現方法,實例分析了基于Go語言實現的簡易服務器的TCP客戶端與服務器端實現技巧,需要的朋友可以參考下2015-02-02