Here is an example of a basic usage of the context
package to signal the completion of a task executed in a goroutine:
package main
import (
"context"
"log"
"time"
)
const interval = 500
func main() {
ctx, cancel := context.WithCancel(context.Background())
go func() {
time.Sleep(5 * interval * time.Millisecond)
cancel()
}()
f(ctx)
}
func f(ctx context.Context) {
ticker := time.NewTicker(interval * time.Millisecond)
for {
select {
case <-ticker.C:
doSomething()
case <-ctx.Done():
return
}
}
}
func doSomething() { log.Println("tick") }
In this example doSomething()
is executed 5 times before the time.Sleep(...)
function completes and the cancel
function created by the context.WithCancel(...)
sends a value to the channel ctx.Done()
that will end the for
loop and exit.
context.Background()
is used as a base for creating a new context variable as described in the context package documentation.
This is a useful way to signal the completion of a task executed in a goroutine and in this context is a powerful alternative to the usage of sync.waitGroup
.
Top comments (0)