testworker.go 929 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. package main
  2. import (
  3. "context"
  4. "fmt"
  5. "sync"
  6. "time"
  7. )
  8. func main() {
  9. workerSize := 10
  10. dataChan := make(chan int, workerSize)
  11. stopChan := make(chan bool)
  12. waitChan := make(chan bool)
  13. timeoutCtx, cancel := context.WithTimeout(context.TODO(), 5 * time.Second)
  14. defer cancel()
  15. var wg sync.WaitGroup
  16. // consumer worker
  17. for i := 0; i < workerSize; i++ {
  18. // worker
  19. go func(n int) {
  20. L:
  21. for {
  22. select {
  23. case v := <-dataChan:
  24. //time.Sleep(6*time.Second)
  25. fmt.Printf("Worker %d do %d \n", n, v)
  26. wg.Done()
  27. case <-stopChan:
  28. break L
  29. }
  30. }
  31. }(i)
  32. }
  33. // provider
  34. dataSize := 100
  35. wg.Add(dataSize)
  36. go func() {
  37. for i := 0; i < dataSize; i++ {
  38. dataChan <- i
  39. }
  40. }()
  41. // wait
  42. go func() {
  43. wg.Wait()
  44. waitChan <- true
  45. }()
  46. select {
  47. case <-waitChan:
  48. fmt.Println("Ok")
  49. case <-timeoutCtx.Done():
  50. fmt.Println("Timeout")
  51. }
  52. close(stopChan)
  53. fmt.Println("Exit")
  54. }