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{}{}
}
相关推荐
薛定谔的猫喵喵11 分钟前
基于PyQt5的视频答题竞赛系统设计与实现
开发语言·qt·音视频
岱宗夫up17 分钟前
Python 数据分析入门
开发语言·python·数据分析
码界筑梦坊18 分钟前
325-基于Python的校园卡消费行为数据可视化分析系统
开发语言·python·信息可视化·django·毕业设计
多恩Stone22 分钟前
【RoPE】Flux 中的 Image Tokenization
开发语言·人工智能·python
李日灐24 分钟前
C++进阶必备:红黑树从 0 到 1: 手撕底层,带你搞懂平衡二叉树的平衡逻辑与黑高检验
开发语言·数据结构·c++·后端·面试·红黑树·自平衡二叉搜索树
Risehuxyc33 分钟前
备份三个PHP程序
android·开发语言·php
lly20240639 分钟前
PHP Error: 常见错误及其解决方法
开发语言
网安墨雨39 分钟前
Python自动化一------pytes与allure结合生成测试报告
开发语言·自动化测试·软件测试·python·职场和发展·自动化
毕设源码李师姐42 分钟前
计算机毕设 java 基于 java 的图书馆借阅系统 智能图书馆借阅综合管理平台 基于 Java 的图书借阅与信息管理系统
java·开发语言·课程设计
忆~遂愿42 分钟前
Runtime 上下文管理:计算实例的生命周期、延迟最小化与上下文切换优化
java·大数据·开发语言·人工智能·docker