go自编自导自写一片协成池

近段时间,在用go的时候找了许久没有发现go协成池之类的东西,然后自己脑子一热,手撸的一个协成池,希望这个东西可以帮助到,也在go语言中苦苦寻求go协成池的伙伴,有什么想法可以留言到下面

go 复制代码
func TestGoPoll(t *testing.T) {
	task := NewTask(func() error {
		fmt.Println(time.Now())
		return nil
	})
	taskCount := 0
	ticker := time.NewTicker(2 * time.Second)
	p := NewWorkPool(3)
	go func(c *time.Ticker) {
		for {
			p.TaskQueue <- task
			<-c.C
			taskCount++
			if taskCount == 5 {
				p.close()
				break
			}
		}
		return
	}(ticker)
	p.run()
}

type Task struct {
	f func() error
}

func NewTask(f func() error) *Task {
	return &Task{f: f}
}

type WorkPool struct {
	TaskQueue chan *Task
	workNum   int
	shop      chan struct{}
}

func NewWorkPool(cap int) *WorkPool {
	if cap <= 0 {
		cap = 10
	}
	return &WorkPool{
		TaskQueue: make(chan *Task),
		workNum:   cap,
		shop:      make(chan struct{}),
	}
}

func (t *Task) Execute() error {
	return t.f()
}

func (p *WorkPool) worker(workerId int) {
	for task := range p.TaskQueue {
		err := task.Execute()
		if err != nil {
			fmt.Println(err)
			continue
		}
		fmt.Printf("worker %d finished\n", workerId)
	}
}

func (p *WorkPool) run() {
	for i := 0; i < p.workNum; i++ {
		go p.worker(i)
	}
	<-p.shop
}

func (p *WorkPool) close() {
	p.shop <- struct{}{}
}
相关推荐
我是唐青枫6 分钟前
C#.NET ReaderWriterLockSlim 深入解析:读写锁原理、升级锁与使用边界
开发语言·c#·.net
4ever.ov08 分钟前
定时器/时间轮
开发语言·c++·c·muduo·llinux
编程之升级打怪16 分钟前
用排他锁来实现Python语言的变量值更新
开发语言·python
rrrjqy16 分钟前
Java基础篇(二)
java·开发语言
我命由我1234523 分钟前
React - React 配置代理、搜索案例(Fetch + PubSub)、React 路由基本使用、NavLink
开发语言·前端·javascript·react.js·前端框架·html·ecmascript
沐知全栈开发23 分钟前
R 循环:深度解析与高效运用
开发语言
四七伵24 分钟前
Spring Boot项目中varchar字段为什么不用NULL?告别空指针从建表开始
数据库·后端
tsyjjOvO27 分钟前
Spring Boot 入门
java·spring boot·后端
小码哥_常30 分钟前
从云端坠落:PUT和DELETE请求在大公司的失宠之谜
后端
文心快码BaiduComate35 分钟前
有奖征集|解锁Comate超能力:一文玩转Comate Skills
前端·后端