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{}{}
}

相关推荐

  1. go

    2024-04-27 21:32:06       12 阅读
  2. go建线程执行任务

    2024-04-27 21:32:06       18 阅读
  3. go定义error

    2024-04-27 21:32:06       13 阅读
  4. [c++] MyString 类

    2024-04-27 21:32:06       19 阅读
  5. 屏蔽广告脚本

    2024-04-27 21:32:06       11 阅读
  6. Springboot定义线程ThreadPoolTaskExecutor

    2024-04-27 21:32:06       34 阅读
  7. SpringBoot集成定义线程

    2024-04-27 21:32:06       36 阅读
  8. NebulaGraph学习笔记-定义连接

    2024-04-27 21:32:06       27 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-27 21:32:06       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-27 21:32:06       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-27 21:32:06       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-27 21:32:06       20 阅读

热门阅读

  1. undo log和redo log区分

    2024-04-27 21:32:06       15 阅读
  2. LeetCode-101-对称二叉树

    2024-04-27 21:32:06       14 阅读
  3. Android 14 transtion 动画流程

    2024-04-27 21:32:06       12 阅读
  4. Redis中transactions命令详解

    2024-04-27 21:32:06       11 阅读
  5. QT C++ QCustomPlot 简单使用

    2024-04-27 21:32:06       13 阅读
  6. mac上用brew安装node

    2024-04-27 21:32:06       12 阅读