GO workPool的線(xiàn)程池實(shí)現(xiàn)
Go語(yǔ)言中的線(xiàn)程池是一種用于管理并發(fā)執(zhí)行任務(wù)的設(shè)計(jì)模式。
線(xiàn)程池的主要目的是減少創(chuàng)建和銷(xiāo)毀線(xiàn)程的開(kāi)銷(xiāo),提高系統(tǒng)性能。 在Go語(yǔ)言中,線(xiàn)程池通常使用goroutine和channel來(lái)實(shí)現(xiàn)。
以下是一個(gè)簡(jiǎn)單的Go線(xiàn)程池實(shí)現(xiàn):
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() }
說(shuō)明
在這個(gè)例子中,我們創(chuàng)建了 Worker結(jié)構(gòu)體,它包含一個(gè)JobQueue通道,用于接收任務(wù)。 NewWorker函數(shù)用于創(chuàng)建一個(gè)新的Worker實(shí)例。 Run方法啟動(dòng)一個(gè)goroutine,監(jiān)聽(tīng)JobQueue通道,當(dāng)有任務(wù)到來(lái)時(shí),執(zhí)行任務(wù)并通知WaitGroup。
Pool結(jié)構(gòu)體包含一個(gè)JobQueue通道和一個(gè)WorkerQueue通道。 JobQueue用于接收任務(wù),WorkerQueue用于存儲(chǔ)空閑的Worker。 NewPool函數(shù)用于創(chuàng)建一個(gè)新的Pool實(shí)例。 Run方法啟動(dòng)指定數(shù)量的 Worker并將它們添加到 WorkerQueue中。然后啟動(dòng)一個(gè)goroutine,監(jiān)聽(tīng) JobQueue通道,當(dāng)有任務(wù)到來(lái)時(shí),從 WorkerQueue中取出一個(gè)空閑的 Worker,將任務(wù)分配給它。
在main函數(shù)中,我們創(chuàng)建一個(gè)包含5個(gè)Worker的線(xiàn)程池,并向線(xiàn)程池提交10個(gè)任務(wù)。 使用WaitGroup來(lái)等待所有任務(wù)完成。
小結(jié)有需要的小伙伴可以加以修改使用
到此這篇關(guān)于GO workPool的線(xiàn)程池實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)GO workPool線(xiàn)程池內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go語(yǔ)言服務(wù)器開(kāi)發(fā)之簡(jiǎn)易TCP客戶(hù)端與服務(wù)端實(shí)現(xiàn)方法
這篇文章主要介紹了Go語(yǔ)言服務(wù)器開(kāi)發(fā)之簡(jiǎn)易TCP客戶(hù)端與服務(wù)端實(shí)現(xiàn)方法,實(shí)例分析了基于Go語(yǔ)言實(shí)現(xiàn)的簡(jiǎn)易服務(wù)器的TCP客戶(hù)端與服務(wù)器端實(shí)現(xiàn)技巧,需要的朋友可以參考下2015-02-02詳解Go語(yǔ)言如何利用上下文進(jìn)行并發(fā)計(jì)算
在Go編程中,上下文(context)是一個(gè)非常重要的概念,它包含了與請(qǐng)求相關(guān)的信息,本文主要來(lái)和大家討論一下如何在并發(fā)計(jì)算中使用上下文,感興趣的可以了解下2024-02-02go語(yǔ)言fasthttp使用實(shí)例小結(jié)
fasthttp?是一個(gè)使用?Go?語(yǔ)言開(kāi)發(fā)的?HTTP?包,主打高性能,針對(duì)?HTTP?請(qǐng)求響應(yīng)流程中的?hot?path?代碼進(jìn)行了優(yōu)化,下面我們就來(lái)介紹go語(yǔ)言fasthttp使用實(shí)例小結(jié),感興趣的朋友跟隨小編一起看看吧2024-03-03Go語(yǔ)言基礎(chǔ)語(yǔ)法之結(jié)構(gòu)體及方法詳解
結(jié)構(gòu)體類(lèi)型可以用來(lái)保存不同類(lèi)型的數(shù)據(jù),也可以通過(guò)方法的形式來(lái)聲明它的行為。本文將介紹go語(yǔ)言中的結(jié)構(gòu)體和方法,以及“繼承”的實(shí)現(xiàn)方法2021-09-09使用Go語(yǔ)言實(shí)現(xiàn)LRU緩存的代碼詳解
在日常開(kāi)發(fā)中,緩存是提高系統(tǒng)性能的重要手段,LRU緩存是一種基于“最近最少使用”策略的緩存系統(tǒng),其目的是在空間受限的情況下保留最新、最常用的數(shù)據(jù),本文將詳細(xì)講解如何使用?Go?語(yǔ)言實(shí)現(xiàn)一個(gè)?LRU?緩存,需要的朋友可以參考下2024-11-11Go標(biāo)準(zhǔn)庫(kù)常見(jiàn)錯(cuò)誤分析和解決辦法
Go語(yǔ)言的標(biāo)準(zhǔn)庫(kù)為開(kāi)發(fā)者提供了豐富且高效的工具,涵蓋了從網(wǎng)絡(luò)編程到文件操作等各個(gè)方面,然而,標(biāo)準(zhǔn)庫(kù)雖好,使用不當(dāng)卻可能適得其反,正所謂"工欲善其事,必先利其器",本文將深入剖析Go標(biāo)準(zhǔn)庫(kù)使用中的常見(jiàn)錯(cuò)誤,幫助開(kāi)發(fā)者避開(kāi)這些坑,寫(xiě)出更加健壯的代碼2025-04-04