singletask.go 380 B

12345678910111213141516171819202122232425262728
  1. package rtuUtils
  2. import "sync/atomic"
  3. type SingleTask struct {
  4. running atomic.Bool
  5. }
  6. func (t *SingleTask) Run(f func(), async bool) {
  7. if !t.running.CompareAndSwap(false, true) {
  8. return
  9. }
  10. runFunc := func() {
  11. defer t.running.Store(false)
  12. f()
  13. }
  14. if async {
  15. go runFunc()
  16. } else {
  17. runFunc()
  18. }
  19. }
  20. func (t *SingleTask) IsRunning() bool {
  21. return t.running.Load()
  22. }