go学习笔记-简单协程池模板

//https://studygolang.com/pkgdoc //go语言学习文档
package main

import (
	"fmt"
	"time"
)

// 任务结构体
type Task struct {
	f func()
}

func NewTask(arg_f func()) *Task {
	//创建Task
	t := Task{
		f:arg_f,
	}

	return &t
}

// 任务执行方法
func (t *Task) Execute() {
	t.f()
}

// 协程池结构体
type Pool struct {
	//入口队列
	EntryChannel chan *Task

	//内部队列
	JobsChannel chan *Task

	//协程池大小
	worker_num int
}

func NewPool(num int) *Pool {
	//创建Pool
	p := Pool{
		EntryChannel: make(chan *Task),
		JobsChannel: make(chan *Task),
		worker_num: num,
	}

	return &p
}

// 工作方法
func (p *Pool) worker(worker_ID int) {
	// 持续从内部队列中获取任务执行
	for task := range p.JobsChannel {
		task.Execute()
		fmt.Println("worker ID ", worker_ID, "执行完毕")
	}
}

func (p *Pool) run() {
	// 创建最大数量工作协程
	for i:=0; i<p.worker_num; i++ {
		go p.worker(i)
	}

	// 持续从入口队列获取任务放进内部队列
	for task := range p.EntryChannel {
		p.JobsChannel <- task
	}
}


func main() {

	t := NewTask(func() {
		fmt.Println(time.Now())
	})

	p := NewPool(4)

	go func() {
		for {
			p.EntryChannel <- t
		}
	}()

	p.run()
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值