1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Golang: 指定した間隔でぴったり毎時00分とか30分に処理を実行したい件。

Last updated at Posted at 2020-11-17

tickerが思い通りにならない!

常駐して定期的に実行したいjobがあるが、普通のtickerだと起動してからtickerを作った時からintervalカウントが始まるので、時刻ぴったりに設定できない。しかも、tickerはちゃんと12:00:00になるようにintervalを設定しても、たまに11:59:59.999に動くことがあって、処理したデータがダブって登録されてしまうことがあった。

tickerの使い方と、時刻制御の練習もかねて書いてみた。

https://github.com/xbridges/Scheduler
単純に、指定した時間間隔でぴったりにtickerが呼び出してくれる。

ex) sch, next := NewScheduler(3600, 0)

こんな感じで開始すると、毎時00分に一度tickerが発火します。
さらに、オフセット値を使うと、インターバルは毎時(3600)だけど、offset: 600とか設定すると、毎時05分にtickerが発火します。

偉そうに書いてるけど、やったことはただのラップ(笑

tickerを単純にラップしているだけなんですが、キモは、

is := time.Duration(interval) * time.Second  // <-- 指定時刻をDurationに
n := time.Now()   // <--現在の時刻
ns := n.Round(is) // <--現在時刻を、インターバル時刻でマスクして丸めるような感じ。

こーすると、たまにtickerが早めに動いて、59分59秒.9999になっちゃっても四捨五入してくれるので、時間がちゃんと次の00分に発火するようになります。

定期実行していてちょっとはまったのでメモしました。

2021/06/17: 追記

実際にこのライブラリを使って動作をしていたら、妙に変な動作になることがあって、致命的なバグがありました。申し訳ありません。
修正したものを別ライブラリとして作成しなおしました。恥ずかしい。
https://github.com/xbridges/StickyTicker

参考

http://okzk.hatenablog.com/entry/2015/12/01/001924
https://www.kaoriya.net/blog/2019/12/19/

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?