协程控制
package main
import (
"fmt"
"sync"
"time"
)
type Task struct {
ticker *time.Ticker
runFunc func()
stopChan chan struct{}
isRun bool
mu sync.Mutex
}
func NewTask(interval time.Duration, runFunc func()) *Task {
return &Task{ticker: time.NewTicker(interval), runFunc: runFunc, stopChan: make(chan struct{}), isRun: false}
}
func (t *Task) Start() {
if t.isRun {
return
}
t.isRun = true
go func() {
for {
select {
case <-t.ticker.C:
t.runFunc()
case <-t.stopChan:
t.ticker.Stop()
return
}
}
}()
}
func (t *Task) Stop() {
if !t.isRun {
return
}
t.isRun = false
t.stopChan <- struct{}{}
}
func main() {
task := NewTask(time.Second*2, func() {
fmt.Println("Task is running")
})
task.Start()
time.Sleep(time.Second * 10)
task.Stop()
}
最后更新于