Почему нет тупика, когда канал не закрыт? - PullRequest
0 голосов
/ 15 марта 2019

Go RunTime записывает в канал, затем не закрывает канал, а затем работает нормально.

Почему нет тупика, когда канал не закрыт?

package main

import (
    `fmt`
    `time`
)

func product(num int) chan int {
    ch := make(chan int, 1)

    go func(num int) {
        for i := 0; i < num; i++ {
            ch <- i
        }
    }(num)

    return ch
}

func main() {
    in := product(100)

    go func() {
        for v := range in {
            fmt.Println(v)
        }
    }()

    time.Sleep(time.Second)
}

// 0 1 2 3 4 5 ...

1 Ответ

2 голосов
/ 15 марта 2019

Потому что нет ситуации, когда две goroutines ждут друг друга, и ни одна из них не может продолжить свое выполнение.

Вы читаете из канала в отдельной (не основной) goroutine, в то же время основнойПрограмма не блокируется и завершается, как только таймер достигает 1 секунды.

Если вы переместите цикл чтения для основной процедуры, вы получите ошибку взаимоблокировки.Потому что в этом случае программа будет заблокирована навсегда, так как канал, с которого вы пытаетесь читать, не закрыт, и никто больше не пишет в него.

См. Также Тупик между goroutines

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...