| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- 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.")
- }
- }
|