Почему все горутины спят - тупик с тикером? - PullRequest
0 голосов
/ 28 февраля 2020

Я сделал go в течение некоторого времени, но до сих пор не могу понять, почему эти тупики (https://play.golang.org/p/INeUl_ktMJA):

package main

import (
    "context"
    "time"
)

func main() {
    ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)

    t := time.NewTicker(time.Second)
    for range t.C {
        select {
        case <-ctx.Done():
            t.Stop()
        default:
            print(".")
        }
    }

    cancel()
}

Я ожидал бы закрытый контекст закрыть канал тикера, который должен выйти из диапазона l oop и таким образом очистить контекст. Вместо:

...fatal error: all goroutines are asleep - deadlock!

goroutine 1 [chan receive]:
main.main()
        /Users/andig/htdocs/test.go:12 +0xaf
exit status 2

1 Ответ

2 голосов
/ 28 февраля 2020

В документах для Stop () написано:

Stop не закрывает канал, чтобы предотвратить одновременное чтение программы с канала из-за ошибочного «тика».

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