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 }