ttt 715 B

12345678910111213141516171819202122232425262728293031323334353637
  1. package main
  2. import (
  3. "fmt"
  4. "math/rand"
  5. "sync"
  6. "time"
  7. )
  8. const N = 1000
  9. func CallMe() error {
  10. n := rand.Intn(N)
  11. if n == 888 {
  12. return fmt.Errorf("lucky: %d", n)
  13. }
  14. <-time.After(time.Duration(n) * time.Millisecond)
  15. fmt.Printf("Waited: %d\n", n)
  16. return nil
  17. }
  18. func main() {
  19. // run 1000 goroutine for CallMe, program exit after all goroutines exit.
  20. var wg sync.WaitGroup
  21. for i := 0; i < 1000; i++ {
  22. wg.Add(1)
  23. go func(){
  24. CallMe()
  25. wg.Done()
  26. }
  27. }
  28. wg.Wait()
  29. }
  30. // 2. follow-up: when CallMe hit the lucky number 888, it returns an error immediately.
  31. // we hope the program can gracefully exit when any of the goroutine returns an error,
  32. // without waiting. You can change CallMe function.