Go 實現(xiàn)Goroutine Pool

在Go中應(yīng)用goroutine池,一般是為了限制同時運行的goroutine數(shù)量,以避免資源過度消耗。goroutine池可以通過創(chuàng)建一個工作隊列和一個固定數(shù)量的工作者來實現(xiàn)。以下是一個goroutine池的實現(xiàn)示例:

package main

import (
    "fmt"
    "time"
)

// Job 表示需要處理的任務(wù)
type Job struct {
    id       int
    workload int
}

// Worker 表示工作者
func Worker(id int, jobs <-chan Job, results chan<- int) {
    for job := range jobs {
        fmt.Printf("Worker %d processing job %d\n", id, job.id)
        time.Sleep(time.Duration(job.workload) * time.Second) // 模擬工作時間
        results <- job.id
    }
}

func main() {
    const numJobs = 5    // 總?cè)蝿?wù)數(shù)
    const numWorkers = 3 // 工作者數(shù)

    jobs := make(chan Job, numJobs)   // 創(chuàng)建任務(wù)隊列
    results := make(chan int, numJobs) // 創(chuàng)建結(jié)果隊列

    // 啟動工作者
    for w := range numWorkers {
        go Worker(w, jobs, results)
    }

    // 發(fā)送任務(wù)到任務(wù)隊列
    for j := 0; j < numJobs; j++ {
        jobs <- Job{id: j, workload: j + 1}
    }
    close(jobs) // 關(guān)閉任務(wù)隊列

    // 收集結(jié)果
    for a := 0; a < numJobs; a++ {
        result := <-results
        fmt.Printf("Job %d done\n", result)
    }
}
代碼解析:
  1. Job結(jié)構(gòu)體:表示一個任務(wù),其中包含任務(wù)ID和工作負載(模擬任務(wù)所需的時間)。
  2. Worker函數(shù):表示工作者,從jobs通道中獲取任務(wù)并處理,然后將結(jié)果發(fā)送到results通道。
  3. jobs通道:用于分發(fā)任務(wù)給工作者。
  4. results通道:用于接收工作者完成任務(wù)后的結(jié)果。
執(zhí)行過程:
  • 主函數(shù)中先創(chuàng)建了jobsresults兩個通道。
  • 然后啟動了一定數(shù)量的goroutine,每個goroutine都調(diào)用Worker函數(shù)并開始等待任務(wù)。
  • 主程序?qū)⑷蝿?wù)發(fā)送到jobs通道,然后關(guān)閉通道以表示沒有更多任務(wù)。
  • 最后,主程序等待從results通道接收所有任務(wù)的結(jié)果并輸出。

通過這種方式,可以有效地控制同時運行的goroutine數(shù)量,避免系統(tǒng)資源過度消耗。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容