golang协程池 发表于 2018-06-12 golang 简单的协程池的实现123456789101112131415161718192021222324252627282930313233343536import "sync"type Worker interface { Task()}type Pool struct { work chan Worker wg sync.WaitGroup}func New(maxGoroutines int) *Pool { p := Pool{work: make(chan Worker)} p.wg.Add(maxGoroutines) for i := 0; i < maxGoroutines; i++ { go func() { for w := range p.work { w.Task() } p.wg.Done() }() } return &p}func (p *Pool) Run(w Worker) { p.work <- w}func (p *Pool) Shutdown() { close(p.work) p.wg.Wait()} 使用姿势:只要实现 Task 的接口就行了123456789101112131415161718192021222324252627282930313233343536373839404142434445package mainimport ( "Goexample/workpool/work" // 导入这个已写好协程池包 "log" "sync" "time")var names = []string{ "steve", "boy", "girl",}type namePrinter struct { name string}func (m *namePrinter) Task() { log.Println(m.name) time.Sleep(time.Second)}func main() { var wg sync.WaitGroup p := work.New(10) // New 10 个协程池 for i := 0; i < 30; i++ { for _, name := range names { wg.Add(1) np := &namePrinter{ name: name, } go func() { p.Run(np) wg.Done() }() } } wg.Wait() p.Shutdown()}