package main import ( "context" "fmt" "sync" "time" ) func main() { fields := []int{5, 3, 2, 6, 4} // Sleep second wg := sync.WaitGroup{} wg.Add( len(fields) ) timeout := 5 MAXROUTINE := 10 dataChan := make(chan int, MAXROUTINE) stopChan := make(chan bool) defer close(stopChan) waitChan := make(chan bool) timeoutCtx, cancel := context.WithTimeout(context.TODO(), time.Duration(timeout) * time.Second) defer cancel() // consumer worker for i := 0; i < MAXROUTINE; i++ { // worker go func(n int) { L: for { select { case field := <-dataChan: time.Sleep(time.Second * time.Duration(field)) fmt.Println("Field", field) wg.Done() case <-stopChan: break L } } }(i) } // provider go func() { for i := 0; i < len(fields); i++ { dataChan <- fields[i] } }() // wait go func() { wg.Wait() waitChan <- true }() select { case <-waitChan: fmt.Println("Run finished.") case <-timeoutCtx.Done(): fmt.Println("Run timeout.") } }