package main
import (
"fmt"
"sync"
"time"
)
type Task struct {
ID int
Job func()
}
type Pool struct {
taskQueue chan Task
wg sync.WaitGroup
}
func NewPool(size int) *Pool {
return &Pool{
taskQueue: make(chan Task, size),
}
}
func (p *Pool) worker() {
defer p.wg.Done()
for task := range p.taskQueue {
fmt.Printf("Worker started task %d\n", task.ID)
time.Sleep(time.Second)
task.Job()
}
}
func (p *Pool) Stop() {
close(p.taskQueue)
}
func (p *Pool) Wait() {
p.wg.Wait()
}
func (p *Pool) AddWorker(num int) {
p.wg.Add(num)
for i := 0; i < num; i++ {
go p.worker()
}
}
func (p *Pool) AddTask(task Task) {
p.taskQueue <- task
}
func main() {
pool := NewPool(0)
pool.AddWorker(3)
for i := 0; i < 10; i++ {
taskID := i
task := Task{
ID: taskID,
Job: func() {
fmt.Printf("Task %d is running\n", taskID)
},
}
pool.AddTask(task)
}
pool.Stop()
pool.Wait()
}