go协程池
package main
import (
"fmt"
"sync"
"time"
)
type Task struct {
ID int
Run func() error
}
type Pool struct {
taskChan chan Task
workerNum int
wg sync.WaitGroup
}
func main() {
// 创建协程池,3个worker,任务队列容量10
pool := NewPool(3, 10)
pool.Start()
// 投递10个任务
for i := 0; i < 10; i++ {
taskID := i
task := Task{
ID: taskID,
Run: func() error {
fmt.Printf("任务%d开始执行\n", taskID)
time.Sleep(time.Second) // 模拟耗时操作
fmt.Printf("任务%d执行完成\n", taskID)
return nil
},
}
pool.AddTask(task)
}
// 等待所有任务完成
pool.Wait()
fmt.Println("所有任务执行完毕")
}
func NewPool(workerNum, taskCapacity int) *Pool {
return &Pool{
taskChan: make(chan Task, taskCapacity),
workerNum: workerNum,
}
}
func (p *Pool) Start() {
for i := 0; i < p.workerNum; i++ {
go p.worker()
}
}
func (p *Pool) worker() {
for task := range p.taskChan {
task.Run()
p.wg.Done()
}
}
func (p *Pool) AddTask(task Task) {
p.wg.Add(1)
p.taskChan <- task
}
func (p *Pool) Wait() {
close(p.taskChan)
p.wg.Wait()
}