package main import ( "fmt" "runtime" "strings" "time" ) type Task struct { Name string } func process(task *Task) { task.Name = strings.ToLower(task.Name) } func Worker(in, out chan *Task) { for { t := <-in process(t) out <- t } } func sendWork(out chan *Task) { for i := 0; i < 1000000; i++ { out <- &Task{Name: fmt.Sprintf("HELLO %d!", i)} } } func consumeWork(in chan *Task) { for task := range in { fmt.Printf("RX: %+v\n", *task) } } func main() { runtime.GOMAXPROCS(4) pending, done := make(chan *Task), make(chan *Task) N := 16 go sendWork(pending) // put tasks with work on the channel for i := 0; i < N; i++ { go Worker(pending, done) } go consumeWork(done) time.Sleep(1e9) }