Skip to content

Instantly share code, notes, and snippets.

@mocyuto
Created April 9, 2021 01:47
Show Gist options
  • Save mocyuto/4d700ef02c5e58025fe46e83b79e7304 to your computer and use it in GitHub Desktop.
Save mocyuto/4d700ef02c5e58025fe46e83b79e7304 to your computer and use it in GitHub Desktop.
Time out with errgroup
package main
import (
"context"
"fmt"
"log"
"time"
"golang.org/x/sync/errgroup"
)
func main() {
c, cancel := context.WithTimeout(context.Background(), 2021*time.Millisecond)
defer cancel()
eg, ctx := errgroup.WithContext(c)
for i := 0; i < 10; i++ {
i := i
eg.Go(func() error {
start := time.Now()
err := sleepWithContext(ctx, cancel, i+1)
fmt.Printf("%v %0.1f秒: %v\n", i, (time.Now().Sub(start)).Seconds(), err)
return err
})
}
fmt.Println("Start")
if err := eg.Wait(); err != nil {
log.Fatal(err)
}
}
func sleepWithContext(ctx context.Context, cancel func(), i int) error {
ticker := time.NewTicker(time.Duration(i) * time.Second)
defer ticker.Stop()
for {
select {
case <-ctx.Done():
return ctx.Err()
case <-ticker.C:
return nil
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment