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)

}

相关推荐
Wonderful U12 分钟前
基于Python+Django的在线题库与智能阅卷系统:从痛点分析到完整实现
开发语言·python·django
码语智行12 分钟前
拦截器、接口限流、过滤器、防重发/幂等性功能说明
开发语言·网络·python
liulilittle16 分钟前
麻将牌堆渲染(Lua)
开发语言·lua
雨落在了我的手上26 分钟前
初始java(十七):常⽤⼯具类介绍
java·开发语言
无风听海27 分钟前
Bearer Token 权威指南:从原理到生产级安全实践
前端·javascript·安全
凤凰院凶涛QAQ37 分钟前
《Java版数据结构 & 集合类剖析》集合框架的封装设计与顺序表:“从 Iterable 到 ArrayList:集合框架的‘职业树“
java·开发语言·数据结构
riuphan37 分钟前
JavaScript 类型判断完全指南
前端·javascript
Hilaku44 分钟前
前端工程师最终会变成 AI工程师?
前端·javascript·程序员
孟华苏1 小时前
怎么快速排查内存泄漏问题
java·开发语言·python
zz34572981131 小时前
C语言中字符串常量存储位置
c语言·开发语言·算法·青少年编程