GO workPool

Go語(yǔ)言中的線程池是一種用于管理并發(fā)執(zhí)行任務(wù)的設(shè)計(jì)模式。

線程池的主要目的是減少創(chuàng)建和銷毀線程的開銷,提高系統(tǒng)性能。
在Go語(yǔ)言中,線程池通常使用goroutine和channel來(lái)實(shí)現(xiàn)。

以下是一個(gè)簡(jiǎn)單的Go線程池實(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()
}

在這個(gè)例子中,我們創(chuàng)建了一個(gè)Worker結(jié)構(gòu)體,它包含一個(gè)JobQueue通道,用于接收任務(wù)。
NewWorker函數(shù)用于創(chuàng)建一個(gè)新的Worker實(shí)例。
Run方法啟動(dòng)一個(gè)goroutine,監(jiān)聽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)聽
JobQueue通道,當(dāng)有任務(wù)到來(lái)時(shí),從
WorkerQueue中取出一個(gè)空閑的
Worker,將任務(wù)分配給它。

main函數(shù)中,我們創(chuàng)建一個(gè)包含5個(gè)Worker的線程池,并向線程池提交10個(gè)任務(wù)。
使用WaitGroup來(lái)等待所有任務(wù)完成。

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

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

  • 本文是《Go系列教程》的第二十篇文章。 什么是緩沖區(qū)通道 我們前面所講的大多數(shù)都是基本的非緩沖區(qū)通道。正如我們?cè)谕?..
    大風(fēng)過崗閱讀 460評(píng)論 0 0
  • Channel 是什么? channel,通道,本質(zhì)上是一個(gè)通信對(duì)象,goroutine 之間可以使用它來(lái)通信。從...
    癩痢頭閱讀 1,121評(píng)論 0 0
  • 并發(fā)是編程里面一個(gè)非常重要的概念,Go語(yǔ)言在語(yǔ)言層面天生支持并發(fā),這也是Go語(yǔ)言流行的一個(gè)很重要的原因。 Go語(yǔ)言...
    羋學(xué)僧閱讀 834評(píng)論 0 6
  • Go語(yǔ)言中的并發(fā)編程 并發(fā)是編程里面一個(gè)非常重要的概念,Go語(yǔ)言在語(yǔ)言層面天生支持并發(fā),這也是Go語(yǔ)言流行的一個(gè)很...
    吳佳浩閱讀 405評(píng)論 0 1
  • go并發(fā)編程入門到放棄 并發(fā)和并行 并發(fā):一個(gè)處理器同時(shí)處理多個(gè)任務(wù)。 并行:多個(gè)處理器或者是多核的處理器同時(shí)處理...
    yangyunfeng閱讀 649評(píng)論 0 2

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