今天来和大家探讨一下关于协成池,大家在工作用使用go开发工作避免不了使用到go中的协成,使用协成的一个特点就是很难控制,今天小码自己使用go语言自创了一个go的协成池,有不同看法的可以评论在下方大家一起进步呦
func TestExecute(t *testing.T) {
pool := NewRoutinePool(5)
for i := 0; i < 100; i++ {
task := i
pool.AddTask(func() {
fmt.Printf("执行任务 %d \n", task)
time.Sleep(time.Second * 3)
})
}
pool.Wait()
fmt.Println("任务执行完毕!")
}
type routinePool struct {
wg sync.WaitGroup
taskQueue chan func()
}
func (pool *routinePool) worker() {
for task := range pool.taskQueue {
task()
pool.wg.Done()
}
}
func (pool *routinePool) AddTask(task func()) {
pool.wg.Add(1)
pool.taskQueue <- task
}
func (pool *routinePool) Wait() {
pool.wg.Done()
}
func NewRoutinePool(goroutineNum int) *routinePool {
pool := &routinePool{
taskQueue: make(chan func(), goroutineNum),
}
for i := 0; i < goroutineNum; i++ {
go pool.worker()
}
return pool
}