Multitick is an open source project which helps us coordinate worker goroutines. It broadcasts a
time.Ticker to multiple receivers, all of which receive the same values, aligned to an offset. This makes the workers more testable by avoiding nondeterministic use of
time.Tick() inside them.
The package is a wrapper around a single
time.Ticker in the Go language, which provides a way for many listeners to subscribe to a single set of ticks. If a subscriber is busy and can’t receive a tick, it will be discarded; the implementation is non-blocking. Additionally, ticks can be aligned to a specific boundary easily, which eliminates annoying code from your programs.
Install multitick in the usual way:
go get github.com/VividCortex/multitick
And import it:
import ( "github.com/VividCortex/multitick" )
To use multitick, create a ticker with the desired interval and offset. For example, to create a once-per-second ticker that will send at 750 milliseconds past the clock tick,
tick := multitick.NewTicker(time.Second, time.Millisecond*750)
If you want the ticker to start immediately instead of waiting, you can pass a negative number as the second parameter. Now subscribe to ticks. Here’s an example of starting worker routines with ticker channels:
go someFunc(tick.Subscribe()) go otherFunc(tick.Subscribe())
Subscribe returns a channel to which ticks will be delivered. Ticks that can’t be delivered to the channel are discarded.
Try it out and let us know what you think. Pull requests are welcome!