golang 协程池实现

39 阅读1分钟
package main

import (
   "fmt"
   "time"
)

type Task struct {
   f func() error
}

type Pool struct {
   numWorkers int
   taskChan   chan Task
   quitChan   chan struct{}
}

func NewPool(numWorkers int) *Pool {
   pool := &Pool{
      numWorkers: numWorkers,
      taskChan:   make(chan Task),
      quitChan:   make(chan struct{}),
   }

   for i := 0; i < numWorkers; i++ {
      go pool.worker()
   }
   return pool
}

func (p *Pool) worker() {
   for {
      select {
      case task := <-p.taskChan:
         task.f()
      case <-p.quitChan:
         return
      }
   }
}

func (p *Pool) submit(task Task) {
   p.taskChan <- task
}

func (p *Pool) stop() {
   close(p.quitChan)
}

func main() {
   pool := NewPool(2)
   for i := 0; i < 10; i++ {
      task := Task{
         f: func() error {
            fmt.Println("Executing task")
            return nil
         },
      }
      pool.submit(task)
   }
   time.Sleep(time.Second)
   pool.stop()
}