sleepy_gopher.go 1009 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. package main
  2. import (
  3. "fmt"
  4. "math/rand"
  5. "time"
  6. )
  7. func init() {
  8. rand.Seed(time.Now().Unix())
  9. }
  10. func SleepyGopher(id int, c chan int) {
  11. duration := time.Duration(rand.Intn(4000)) * time.Millisecond
  12. fmt.Printf("gopher %d sleep for %v\n", id, duration)
  13. time.Sleep(duration)
  14. c <- id
  15. }
  16. func main() {
  17. timeout := time.After(2 * time.Second)
  18. c := make(chan int, 5)
  19. /**
  20. Горутины для гоферов нужно создать заранее. Если делать это в for
  21. с select, то select будет блокировать дальнейшее исполнение и
  22. создание следующей горутины
  23. **/
  24. for i := 0; i < 5; i++ {
  25. go SleepyGopher(i, c)
  26. }
  27. for i := 0; i < 5; i++ {
  28. select {
  29. case gopherID := <-c: // Ждет пока проснется гофер
  30. fmt.Println("gopher: ", gopherID, "has finished sleeping")
  31. case <-timeout: // Ждет окончания времени
  32. fmt.Println("my patience ran out\n")
  33. return
  34. }
  35. }
  36. }