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)

}

相关推荐
JerrySir6 小时前
恶意 npm 包只活了 17 分钟:技术面试里,为什么“升级依赖”还不算止血?
javascript·安全
白帽小阳6 小时前
2026前端面试题!(附答案及解析)
javascript·网络·python·安全·web安全·网络安全·护网行动
这是个栗子6 小时前
前端开发中的常用工具函数(八)
开发语言·前端·javascript
Hilaku6 小时前
Vue 和 React 真正的差距,不在语法,而在团队犯错成本
前端·javascript·程序员
凤凰院凶涛QAQ6 小时前
《Java版数据结构 & 集合类剖析》栈与队列:“push/pop 是栈的灵魂,offer/poll 是队列的骨架——四组 API,两种人生”
java·开发语言·数据结构
研☆香6 小时前
为什么变量声明在赋值前也能使用?—— 深入理解 JavaScript 变量提升与作用域
开发语言·前端·javascript
右耳朵猫AI6 小时前
PHP周刊2026W28 | 安全更新、Laravel 13.18、Twig 3.28
开发语言·php·laravel
second606 小时前
第一部分:快速上手 —— 建立 C++ 基本语法与编程范式
开发语言·c++
郝学胜-神的一滴7 小时前
算法实战:最小k个数——大顶堆的优雅解法
开发语言·数据结构·c++·python·程序人生·算法·排序算法
bksczm7 小时前
linux之线程概念和控制
linux·开发语言·c++