改编为以下脚本:
package main
import (
"fmt"
"time"
)
func main() {
ticker := time.NewTicker(500 * time.Millisecond)
done := make(chan bool)
go func() {
for {
select {
case <-done:
fmt.Println("Received 'done'")
return
case t := <-ticker.C:
fmt.Println("Tick at", t)
}
}
}()
time.Sleep(1600 * time.Millisecond)
// ticker.Stop()
done <- true
// fmt.Println("Ticker stopped.")
}
与引用示例的两个区别是我注释掉了该ticker.Stop()行并fmt.Println("Received 'done'")在case <-done块中添加了一行。如果我运行它,我会观察到以下输出:
> go run tickers.go
Tick at 2019-10-06 15:25:50.576798 -0700 PDT m=+0.504913907
Tick at 2019-10-06 15:25:51.074993 -0700 PDT m=+1.003102855
Tick at 2019-10-06 15:25:51.576418 -0700 PDT m=+1.504521538
我的问题:为什么它不打印Received 'done'到终端?
奇怪的是,如果我在Ticker stoppedPrintln 语句中发表评论,我也会看到Received 'done':
> go run tickers.go
Tick at 2019-10-06 15:27:30.735163 -0700 PDT m=+0.504666656
Tick at 2019-10-06 15:27:31.234076 -0700 PDT m=+1.003573649
Tick at 2019-10-06 15:27:31.735342 -0700 PDT m=+1.504833296
Ticker stopped.
Received 'done'
我记得,Goroutine 中的代码可以假设同步运行,所以我很困惑,因为我没有看到Println前一种情况下语句的效果,因为它发生在 Goroutine 返回之前。有人可以解释一下吗?
去并发性协程
慕森王
SMILET