【发布时间】:2021-07-04 13:45:30
【问题描述】:
我有一个与How to stop a goroutine 类似的问题,但稍有不同。我不确定 goroutine 是否正在运行。
var quit = make(chan bool)
func f1() {
go func() {
t := time.NewTimer(time.Minute)
select {
case <-t.C:
// Do stuff
case <-quit:
return
}
}()
}
func f2() {
quit <- true
}
如果在f1() 之后不到一分钟调用了f2(),则goroutine 返回。但是,如果它在一分钟后被调用,goroutine 将已经返回,f2() 将阻塞。
我希望 f2() 在 goroutine 正在运行时取消它,否则什么也不做。
我在这里想要实现的是当且仅当它没有在创建后的一分钟内被取消时才执行任务。
说明:
- 没有什么可以阻止
f2()被多次调用。 - 一次只运行一个 goroutine。
f1()的调用者将确保每分钟调用它不超过一次。
【问题讨论】: