jl-iot/service/qc_handle_task.go

51 lines
901 B
Go
Raw Normal View History

package service
import (
"context"
"log/slog"
"time"
)
type qcHandleTask struct {
fn func()
interval time.Duration
cancel context.CancelFunc
done chan struct{} // 服务协程退出信号
}
// Stop implements QcDataHandleScheduleTask.
func (t *qcHandleTask) Stop() {
t.cancel()
<-t.done
slog.Info("驱采数据处理任务线程退出")
}
func (t *qcHandleTask) run(ctx context.Context) {
defer close(t.done)
mainLoop:
for {
select {
case <-ctx.Done():
break mainLoop
default:
}
t.fn()
time.Sleep(t.interval)
}
}
func NewQcHandleTask(run func(), interval time.Duration) QcDataHandleScheduleTask {
if interval <= 0 {
interval = time.Second
}
task := &qcHandleTask{
fn: run,
interval: interval,
done: make(chan struct{}),
}
ctx, cancel := context.WithCancel(context.Background())
go task.run(ctx)
task.cancel = cancel
return task
}