канал потребляет порядок в другой программе - PullRequest
0 голосов
/ 22 ноября 2018
package main

import (
    "fmt"
    "time"
)

func main() {
    done := make(chan bool)

    go func() {
        for {
            select {
            case <-done:
                fmt.Println("here")
            }
        }
    }()

    go func() {
        q := time.NewTimer(time.Second)
        <-q.C
        done <- true
    }()

    <-done
    fmt.Println("closing")
}

У меня вопрос, если канал done потребляется goroutine, а не main goroutine.программа будет заблокирована.

Но дело в том, что программа никогда не блокируется. Кажется, что основная программа занята каналом done каждый раз.

Почему?

1 Ответ

0 голосов
/ 22 ноября 2018

Хотя я не нашел ответа в документации, похоже, получает значение подпрограмма, которая сначала пыталась прочитать с канала.В нашем случае метод main всегда почти всегда достигает <-done (99,0%), потому что подпрограммы запускаются асинхронно и требуют времени для запуска.Но в любом случае, я настоятельно рекомендую вам не полагаться на это, так как это не гарантируется.

Чтобы продемонстрировать это, посмотрите на следующий пример:

package main

import (
    "fmt"
    "time"
)

func main() {
    done := make(chan bool)

    n := 5

    for i := 0; i < n; i++ {
        go func(i int) {
            fmt.Println(i, "Waiting to read")
            <-done
            fmt.Println(i, "DONE")
        }(i)
        time.Sleep(time.Second)
    }

    time.Sleep(time.Second)

    for i := 0 ; i < n; i++ {
        time.Sleep(time.Second)
        done <- true
    }

    time.Sleep(time.Second)
}

, который будет производить вывод

0 Waiting to read
1 Waiting to read
2 Waiting to read
3 Waiting to read
4 Waiting to read
0 DONE
1 DONE
2 DONE
3 DONE
4 DONE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...