Hello everyone,
Recently, I came across this problem where I had to wait on a condition
variable until either:
1. The condition was met
2. OR a deadline was reached
This is how I implemented a solution:
func DoSomething(ctx context.Context) error {
if _, ok := ctx.Deadline(); ok {
go broadcastOnCon(ctx)
}
cond.L.Lock()
defer cond.L.Unlock()
for <some condition is not met> {
cond.Wait()
if err := ctx.Err(); err != nil {
return err
}
}
}
func broadcastOnCon(ctx context.Context) {
<-ctx.Done()
cond.L.Lock()
defer cond.L.Unlock()
cond.Broadcast()
}
My concern is here is that I am creating way too many go routines.
I looked for help online and stumbled on this
thread: https://github.com/golang/go/issues/16620
The thread ends with the reference to context.AfterFunc. The documentation
for this function states:
*AfterFunc arranges to call f in its own goroutine after ctx is canceled.
If ctx is already canceled, AfterFunc calls f immediately in its own
goroutine.*
Does this mean that the AfterFunc is pretty much doing what I was doing? Or
is the internal implementation different? Will my concern of creating too
many go routines be mitigated if I use AfterFunc?
Thanks in advance.
Regards,
Ameya
--
You received this message because you are subscribed to the Google Groups
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion visit
https://groups.google.com/d/msgid/golang-nuts/21e6b150-9212-4d58-b399-9be9df8af675n%40googlegroups.com.