【发布时间】:2018-02-23 04:40:16
【问题描述】:
func startTimer(ctx context.Context, intervalTime int) {
intervalChan := make(chan bool)
go func() {
for {
select {
case <-ctx.Done():
return
case <-time.After(time.Second * time.Duration(intervalTime)):
intervalChan <- true
}
}
}()
for {
select {
case <-ctx.Done():
return
case <-intervalChan:
doSomething()
}
}
你好,我上面写了一个func,想知道会不会导致goroutine泄漏。
例如,第一个 select 语句向 intervalChan 发送一个 true,然后第二个 select 语句从 ctx.Done() 接收 Done 标志并返回。 goroutine 会永远被阻塞吗?
【问题讨论】:
-
你用 defer 取消你的上下文吗?文档中的第 3 段golang.org/pkg/context.. 还有为什么使用
intervalChan它更干净地实现一个带超时的上下文,因为你已经在使用一个上下文并删除intervalChangolang.org/pkg/context/#example_WithTimeout -
嗨@reticentroot,在我的原始程序中,上下文用于手动取消计时器。并且使用上下文的超时可能在功能上与我的 func 不同
标签: go memory-leaks goroutine