【发布时间】:2019-10-06 22:34:04
【问题描述】:
我已将此示例 https://gobyexample.com/tickers 改编为以下脚本:
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() 行并在case <-done 块中添加了fmt.Println("Received '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 stopped Println 语句中发表评论,我确实也会看到 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 返回之前.有人可以解释一下吗?
【问题讨论】:
标签: go concurrency goroutine