blob: b10b8b29f06349ea91777899080fc7118e39e527 [file] [log] [blame]
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
}