// https://play.golang.org/p/hkAZVC2-H3S package main import ( "fmt" "time" ) func main() { fmt.Println("Hello, playground") in := make(chan int, 4) go worker(1, in) go worker(2, in) go func() { time.Sleep(time.Second * 2) in <- 1 }() t := time.NewTimer(time.Second * 10) <-t.C t.Stop() } func worker(id int, in <-chan int) { d := time.Second * 5 t := time.NewTicker(d) defer func() { t.Stop() fmt.Printf("%d worker exited\n", id) }() for { select { case i := <-in: fmt.Printf("received %d on worker %d\n", i, id) // reset the ticker t.Reset(d) case <-t.C: fmt.Printf("worker %d reached max idle duration, will exit\n", id) return } } }