Skip to content

singchia/go-timer

Repository files navigation

GO-TIMER

Go License Go Report Card

Overview

A high performance timer with minimal goroutines.

How it works

Features

  • One goroutine runs all
  • Goroutine safe
  • Clean and simple, no third-party deps at all
  • High performance with timing-wheels algorithm
  • Minimal resources use
  • Managed data and handler
  • Customizing channel
  • Well tested

Usage

Quick Start

packagemain

import(
"log"
"time"

timer"github /singchia/go-timer/v2"
)

funcmain() {
t1:=time.Now()
// new timer
t:=timer.NewTimer()
// add a tick in 1s
tick:=t.Add(time.Second)
// wait for it
<-tick.C()
// tick fired as time is up, calculate and print the elapse
log.Printf("time elapsed: %fs\n",time.Now().Sub(t1).Seconds())
}

Async handler

packagemain

import(
"log"
"sync"
"time"

timer"github /singchia/go-timer/v2"
)

funcmain() {
// we need a wait group since using async handler
wg:=sync.WaitGroup{}
wg.Add(1)
// new timer
t:=timer.NewTimer()
// add a tick in 1s with current time and a async handler
t.Add(time.Second,timer.WithData(time.Now()),timer.WithHandler(func(event*timer.Event) {
deferwg.Done()
// tick fired as time is up, calculate and print the elapse
log.Printf("time elapsed: %fs\n",time.Now().Sub(event.Data.(time.Time)).Seconds())
}))

wg.Wait()
}

With cyclically

packagemain

import(
"log"
"time"

timer"github /singchia/go-timer/v2"
)

funcmain() {
t1:=time.Now()
// new timer
t:=timer.NewTimer()
// add cyclical tick in 1s
tick:=t.Add(time.Second,timer.WithCyclically())
for{
// wait for it cyclically
<-tick.C()
t2:=time.Now()
// calculate and print the elapse
log.Printf("time elapsed: %fs\n",t2.Sub(t1).Seconds())
t1=t2
}
}

License

© Austin Zhai, 2015-2025

Released under theApache License 2.0