I have a question similar to How to stop a goroutine with a small twist. I don't know for sure if the goroutine is running.
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
}
If f2()
is called less than a minute after f1()
, then the goroutine returns. However, if it is called later than one minute, the goroutine will have already returned and f2()
would block.
I want f2()
to cancel the goroutine if it is running and do nothing otherwise.
What I'm trying to achieve here is to perform a task if and only if it is not canceled within a minute of creation.
Clarifications:
- There is nothing to stop
f2()
from being called more than once. - There is only one goroutine running at a time. The caller of
f1()
will make sure that it's not called more than once per minute.