Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get time.Tick to tick immediately

Tags:

go

timer

I have a loop that iterates until a job is up and running:

ticker := time.NewTicker(time.Second * 2) defer ticker.Stop()  started := time.Now() for now := range ticker.C {     job, err := client.Job(jobID)     switch err.(type) {     case DoesNotExistError:         continue     case InternalError:         return err     }      if job.State == "running" {         break     }      if now.Sub(started) > time.Minute*2 {         return fmt.Errorf("timed out waiting for job")     } } 

Works great in production. The only problem is that it makes my tests slow. They all wait at least 2 seconds before completing. Is there anyway to get time.Tick to tick immediately?

like image 975
Xavi Avatar asked Sep 21 '15 22:09

Xavi


1 Answers

Unfortunately, it seems that Go developers will not add such functionality in any foreseeable future, so we have to cope...

There are two common ways to use tickers:

for loop

Given something like this:

ticker := time.NewTicker(period) defer ticker.Stop() for <- ticker.C {     ... } 

Use:

ticker := time.NewTicker(period) defer ticker.Stop() for ; true; <- ticker.C {     ... } 

for-select loop

Given something like this:

interrupt := make(chan os.Signal, 1) signal.Notify(interrupt, os.Interrupt)  ticker := time.NewTicker(period) defer ticker.Stop()  loop: for {     select {         case <- ticker.C:              f()         case <- interrupt:             break loop     } } 

Use:

interrupt := make(chan os.Signal, 1) signal.Notify(interrupt, os.Interrupt)  ticker := time.NewTicker(period) defer ticker.Stop()  loop: for {     f()      select {         case <- ticker.C:              continue         case <- interrupt:             break loop     } } 

Why not just use time.Tick()?

While Tick is useful for clients that have no need to shut down the Ticker, be aware that without a way to shut it down the underlying Ticker cannot be recovered by the garbage collector; it "leaks".

https://golang.org/pkg/time/#Tick

like image 171
Bora M. Alper Avatar answered Sep 18 '22 08:09

Bora M. Alper