package main
import (
  "fmt"
  "time"
)
type Pool struct {
  work chan func()   // 任务
  size chan struct{} // 数量
}
func New(size int) *Pool {
  return &Pool{
    work: make(chan func()),
    size: make(chan struct{}, size),
  }
}
func (p *Pool) worker(task func()) {
  fmt.Println(111)
  defer func() { <-p.size }()
  for {
    task()
    <-p.work
  }
  fmt.Println(222)
}
func (p *Pool) NewTask(task func()) {
  select {
  case p.work <- task:
    fmt.Println(333)
  case p.size <- struct{}{}:
    fmt.Println(444)
    go p.worker(task)
  }
}
func main() {
  pool := New(2)
  for i := 1; i < 5; i++ {
    pool.NewTask(func() {
      time.Sleep(2 * time.Second)
      fmt.Println(time.Now())
    })
  }
  // 保证所有的协程都执行完毕
  time.Sleep(10 * time.Second)
}