Go 可以使用 channel 和 goroutine 来实现协程池

go channel 和 goroutine 来实现协程池

话不多说直接上代码后面会有注释代码实现过程 下面是一个简单的示例,演示了如何实现一个协程池。

type Pool struct {
    tasks chan func()
    wg    sync.WaitGroup
}

func NewPool(size int) *Pool {
    p := &Pool{
        tasks: make(chan func()),
    }
    p.wg.Add(size)
    for i := 0; i < size; i++ {
        go p.worker()
    }
    return p
}

func (p *Pool) worker() {
    defer p.wg.Done()
    for task := range p.tasks {
        task()
    }
}

func (p *Pool) AddTask(task func()) {
    p.tasks <- task
}

func (p *Pool) Close() {
    close(p.tasks)
}

func (p *Pool) Wait() {
    p.wg.Wait()
}

func main() {
    pool := NewPool(4)
    for i := 0; i < 10; i++ {
        pool.AddTask(func() {
            fmt.Println("task is running")
        })
    }
    pool.Close()
    pool.Wait()
}

在上面的代码中,我们定义了一个 Pool 类型,它包含一个 tasks 字段,用来存储待执行的任务。我们还定义了 NewPool、worker、AddTask、Close 和 Wait 函数,用来创建协程池、执行任务、添加任务、关闭协程池和等待所有任务完成。

当我们调用 NewPool 函数创建一个协程池时,它会初始化 tasks channel,并启动指定数量的 worker goroutine。每个 worker goroutine 都会从 tasks channel 中接收任务并执行。当我们调用 AddTask 函数添加任务时,它会向 tasks channel 发送一个函数值。当我们调用 Close 函数关闭协程池时,它会关闭 tasks channel,这会导致所有 worker goroutine 退出。当我们调用 Wait 函数等待所有任务完成时,它会阻塞直到所有 worker goroutine 退出。

运行上面的代码,你会看到输出 “task is running” 十次。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值