// +build ignore,OMIT package main import "fmt" import "time" func main() { start := time.Now() // START1 OMIT in := make(chan int) out := make(chan []int) go producer(in) // Launch 10 workers. // HL for i := 0; i < 10; i++ { // HL go worker(in, out) // HL } // HL consumer(out, 100) // STOP1 OMIT fmt.Println(time.Since(start)) } // START2 OMIT func worker(in chan int, out chan []int) { for { order := <-in // Receive a work order. // HL result := factor(order) // Do some work. // HL out <- result // Send the result back. // HL } } // STOP2 OMIT // START3 OMIT func producer(out chan int) { for order := 0; ; order++ { out <- order // Produce a work order. // HL } } func consumer(in chan []int, n int) { for i := 0; i < n; i++ { result := <-in // Consume a result. // HL fmt.Println("Consumed", result) } } // STOP3 OMIT // factor returns a list containing x and its prime factors. func factor(x int) (list []int) { list = append(list, x) for f := 2; x >= f; f++ { for x%f == 0 { x /= f list = append(list, f) // Slow down so we can see what happens. time.Sleep(50 * time.Millisecond) } } return }