Skip to content

Instantly share code, notes, and snippets.

@dvasilen
Forked from ngauthier/timeout_and_tick.go
Created November 15, 2017 13:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dvasilen/02f6bac6f37753303efd626014f80603 to your computer and use it in GitHub Desktop.
Save dvasilen/02f6bac6f37753303efd626014f80603 to your computer and use it in GitHub Desktop.
Golang timeout and tick loop
// keepDoingSomething will keep trying to doSomething() until either
// we get a result from doSomething() or the timeout expires
func keepDoingSomething() (bool, error) {
timeout := time.After(5 * time.Second)
tick := time.Tick(500 * time.Millisecond)
// Keep trying until we're timed out or got a result or got an error
for {
select {
// Got a timeout! fail with a timeout error
case <-timeout:
return false, errors.New("timed out")
// Got a tick, we should check on doSomething()
case <-tick:
ok, err := doSomething()
// Error from doSomething(), we should bail
if err != nil {
return false, err
// doSomething() worked! let's finish up
} else if ok {
return true, nil
}
// doSomething() didn't work yet, but it didn't fail, so let's try again
// this will exit up to the for loop
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment