An open API service indexing awesome lists of open source software.

https://github.com/asaf-shitrit/go-wait

A tiny util for patient programs
https://github.com/asaf-shitrit/go-wait

backoff golang jitter polling tiny util wait

Last synced: 4 months ago
JSON representation

A tiny util for patient programs

Awesome Lists containing this project

README

          

# go-wait
[![Tests](https://github.com/asaf-shitrit/go-wait/actions/workflows/run-tests.yml/badge.svg)](https://github.com/asaf-shitrit/go-wait/actions/workflows/run-tests.yml)

A tiny util library for programs that require a little patience ⏰

## Usage
### Wait
Useful for simple cases where a predictable `bool` check should be ran
in a set interval and continue when it is satisfied.
#### Basic usage
```go
import (
wait "github.com/asaf-shitrit/go-wait"
)

checkFunc := func() (bool, error) {
// any bool based logic that changes over a
// given period of time
}

ctx := context.Background() // or pass any ctx you would like
if err := wait.Until(ctx, checkFunc); err != nil {
// handle logical/timeout err
}

// logic that should happen after check is satisfied
```
#### With explicit options
```go
import (
wait "github.com/asaf-shitrit/go-wait"
)

checkFunc := func() (bool, error) {
// any bool based logic that changes over a
// given period of time
}

options := &wait.UntilOptions{
Timeout: time.Minute
Interval: time.Second
}

ctx := context.Background() // or pass any ctx you would like
if err := wait.Until(ctx, checkFunc, options); err != nil {
// handle logical/timeout err
}

// logic that should happen after check is satisfied
```

### Backoff
Really useful in cases that low CPU overhead a constraint and the check intervals
should be backed off after each run.

It was inspired by Go's own `http.Server` `Shutdown` implementation ❤️

#### Basic usage
```go
import (
wait "github.com/asaf-shitrit/go-wait"
)

checkFunc := func() (bool, error) {
// any bool based logic that changes over a
// given period of time
}

ctx := context.Background() // or pass any ctx you would like
if err := wait.Backoff(ctx, checkFunc); err != nil {
// handle logical/timeout err
}

// logic that should happen after check is satisfied
```

#### With explicit options
```go
import (
wait "github.com/asaf-shitrit/go-wait"
)

checkFunc := func() (bool, error) {
// any bool based logic that changes over a
// given period of time
}

options := &wait.BackoffOptions{
BaselineDuration: time.Millisecond,
Limit: 500 * time.Millisecond,
Multiplier: 2,
}

ctx := context.Background() // or pass any ctx you would like
if err := wait.Backoff(ctx, checkFunc, options); err != nil {
// handle logical/timeout err
}

// logic that should happen after check is satisfied
```

### Capabilities
### Timeout & Cancel ⏰
It is aligned with Golang concept of context so explicit cancels & timeout will work
out of the box.
#### Jitter
Allows you to set an amount of jitter percentage that will apply
for the calculation of each interval.