Routine orchestrator for your application
Find a file
Alexander Kiryukhin a4e62510cf Added OS signals handler
Added go.mod
2019-01-11 17:22:06 +03:00
example Added OS signals handler 2019-01-11 17:22:06 +03:00
.gitignore Initial commit 2018-12-05 00:48:33 +03:00
go.mod Added OS signals handler 2019-01-11 17:22:06 +03:00
go.sum Added OS signals handler 2019-01-11 17:22:06 +03:00
LICENSE Initial commit 2018-12-05 00:48:33 +03:00
README.md Added OS signals handler 2019-01-11 17:22:06 +03:00
rutina.go Added OS signals handler 2019-01-11 17:22:06 +03:00
rutina_test.go Added OS signals handler 2019-01-11 17:22:06 +03:00

rutina

Package Rutina (russian "рутина" - ordinary boring everyday work) works like https://godoc.org/golang.org/x/sync/errgroup with small differences:

  1. propagates context to routines
  2. cancels context when any routine ends with any result (not only when error result)

When it need?

Usually, when yout program consists of several routines (i.e.: http server, metrics server and os signals subscriber) and you want to stop all routines when one of them ends (i.e.: by TERM os signal in signal subscriber).

Example

HTTP server with graceful shutdown (example/http_server.go):

// New instance with builtin context. Alternative: r, ctx := rutina.WithContext(ctx)
r, _ := rutina.New()

srv := &http.Server{Addr: ":8080"}
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    io.WriteString(w, "hello world\n")
})

// Starting http server and listen connections
r.Go(func(ctx context.Context) error {
    if err := srv.ListenAndServe(); err != nil {
        return err
    }
    log.Println("Server stopped")
    return nil
})

// Gracefully stoping server when context canceled
r.Go(func(ctx context.Context) error {
    <-ctx.Done()
    log.Println("Stopping server...")
    return srv.Shutdown(ctx)
})

// OS signals listener
r.ListenTermSignals()

if err := r.Wait(); err != nil {
    log.Fatal(err)
}

log.Println("All routines successfully stopped")