go实现协程池

package main

import (

"fmt"

"sync"

"sync/atomic"

"time"

)

type WorkerPool struct {

workers int

jobs chan func()

wg sync.WaitGroup

}

func NewWorkerPool(workers int) *WorkerPool {

pool := &WorkerPool{

workers: workers,

jobs: make(chan func()),

}

pool.startWorkers()

return pool

}

func (p *WorkerPool) startWorkers() {

for i := 0; i < p.workers; i++ {

go func() {

for job := range p.jobs {

job()

}

}()

}

}

func (p *WorkerPool) Do(job func()) {

p.wg.Add(1)

go func() {

defer p.wg.Done()

p.jobs <- job

}()

}

func (p *WorkerPool) Wait() {

p.wg.Wait()

close(p.jobs)

}

func main() {

pool := NewWorkerPool(10)

var count int32

for i := 0; i < 100; i++ {

pool.Do(func() {

time.Sleep(10 * time.Millisecond)

atomic.AddInt32(&count, 1)

})

}

pool.Wait()

fmt.Printf("Count is %d\n", count)

}

相关推荐
Monly2119 分钟前
vue报错:Loading chunk * failed,vue-router懒加载出错问题。
前端·javascript·vue.js
Suckerbin36 分钟前
第十一章-PHP表单传值
开发语言·php
大名人儿43 分钟前
【JS事件循环机制event-loop】
javascript·事件循环·宏任务·微任务·event-loop
天天扭码1 小时前
JavaScript 中 apply 和 call 方法的区别与应用场景
前端·javascript·面试
元亓亓亓1 小时前
Java后端开发day38--不可变集合&Stream流
java·开发语言
努力创造奇迹1 小时前
C 语言联合体、枚举、typedef 详解
c语言·开发语言
纪元A梦1 小时前
华为OD机试真题——阿里巴巴找黄金宝箱Ⅰ(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现
java·c语言·javascript·c++·python·华为od·go
前端啵啵猪1 小时前
基于qiankun实现子应用菜单级keep-alive
前端·javascript
徐小夕1 小时前
写了一款3D可视化编辑器模版,开源!
前端·javascript·github
AI_RSER1 小时前
Python 数据可视化全场景实现(一)
开发语言·人工智能·python·信息可视化·遥感