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)

}

相关推荐
怪兽20142 分钟前
fastjson在kotlin不使用kotlin-reflect库怎么使用?
android·开发语言·kotlin
ClearLiang2 分钟前
Kotlin-协程的挂起与恢复
开发语言·kotlin
彭同学学习日志7 分钟前
Kotlin Fragment 按钮跳转报错解决:Unresolved reference ‘floatingActionButton‘
android·开发语言·kotlin
振华OPPO11 分钟前
Vue:“onMounted“ is defined but never used no-unused-vars
前端·javascript·css·vue.js·前端框架
海域云赵从友12 分钟前
破解跨境数据传输瓶颈:中国德国高速跨境组网专线与本地化 IP 的协同策略
开发语言·php
咚咚王者17 分钟前
人工智能之编程进阶 Python高级:第九章 爬虫类模块
开发语言·python
深蓝海拓1 小时前
使matplot显示支持中文和负号
开发语言·python
syt_biancheng2 小时前
Day3算法训练(简写单词,dd爱框框,3-除2!)
开发语言·c++·算法·贪心算法
拉不动的猪2 小时前
try...catch 核心与生态协作全解析
前端·javascript·vue.js
864记忆2 小时前
Qt Network 模块中的函数详解
开发语言·网络·qt