| 1234567891011121314151617181920212223242526272829303132333435363738394041424344 |
- package main
- import (
- "fmt"
- "math/rand"
- "time"
- )
- func init() {
- rand.Seed(time.Now().Unix())
- }
- func SleepyGopher(id int, c chan int) {
- duration := time.Duration(rand.Intn(4000)) * time.Millisecond
- fmt.Printf("gopher %d sleep for %v\n", id, duration)
- time.Sleep(duration)
- c <- id
- }
- func main() {
- timeout := time.After(2 * time.Second)
- c := make(chan int, 5)
- /**
- Горутины для гоферов нужно создать заранее. Если делать это в for
- с select, то select будет блокировать дальнейшее исполнение и
- создание следующей горутины
- **/
- for i := 0; i < 5; i++ {
- go SleepyGopher(i, c)
- }
- for i := 0; i < 5; i++ {
- select {
- case gopherID := <-c: // Ждет пока проснется гофер
- fmt.Println("gopher: ", gopherID, "has finished sleeping")
- case <-timeout: // Ждет окончания времени
- fmt.Println("my patience ran out\n")
- return
- }
- }
- }
|