From e31fca22c84646d0fccf20dfe6664458abf4a060 Mon Sep 17 00:00:00 2001 From: mapleafgo Date: Wed, 8 Apr 2026 14:25:56 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=BE=85=E6=9C=BA?= =?UTF-8?q?=E6=8E=A7=E5=88=B6=E5=99=A8=E7=9A=84=20context=20=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E5=92=8C=E5=BF=99=E5=BE=AA=E7=8E=AF=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - interval: 添加 Sleep 避免默认分支的忙循环(CPU 100%) - cron: 使用 context.Background() 确保定时任务完整执行,不受外部取消影响 - wait_card: 使用 context.Background() 确保读卡器监听完整执行 这些修复确保了关键操作能够完整运行,同时避免 CPU 资源浪费。 --- internal/routes/play/wait_card.go | 8 +++++--- internal/routes/standby_ctrl/cron.go | 3 ++- internal/routes/standby_ctrl/interval.go | 2 ++ 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/internal/routes/play/wait_card.go b/internal/routes/play/wait_card.go index 7db570b..2bf0a38 100644 --- a/internal/routes/play/wait_card.go +++ b/internal/routes/play/wait_card.go @@ -10,11 +10,12 @@ import ( "game-driver/pkg/card_reader" "game-driver/pkg/channel" "game-driver/pkg/tts" - "go.uber.org/zap" "io/fs" "os" "sync" "time" + + "go.uber.org/zap" ) func WaitCard(ctx context.Context) leaf.HandlerFunc { @@ -79,13 +80,14 @@ func WaitCard(ctx context.Context) leaf.HandlerFunc { defer cardInfo.Close() // 结束信号通道 - cc, cancel := context.WithCancel(context.TODO()) + // 使用独立 context 确保读卡器监听完整执行,不受外部取消影响 + c2, cancel := context.WithCancel(context.Background()) defer cancel() wait.Add(1) go func() { defer wait.Done() - reader.OnCardInfo(cc, func(info *card_reader.CardInfo) { + reader.OnCardInfo(c2, func(info *card_reader.CardInfo) { cardInfo.Send(info.ID) }) }() diff --git a/internal/routes/standby_ctrl/cron.go b/internal/routes/standby_ctrl/cron.go index 9907a02..c4f1a3b 100644 --- a/internal/routes/standby_ctrl/cron.go +++ b/internal/routes/standby_ctrl/cron.go @@ -65,7 +65,8 @@ func Cron(rootRules []cronrange.Rule, cron string, play func(c context.Context) case r := <-a: if r { if ok := m.TryLock(); ok { - ctx, cc := context.WithCancel(context.TODO()) + // 使用独立 context 确保任务完整执行,不受外部取消影响 + ctx, cc := context.WithCancel(context.Background()) cancel = cc waitGroup.Add(1) go func() { diff --git a/internal/routes/standby_ctrl/interval.go b/internal/routes/standby_ctrl/interval.go index 773bb6c..ee5a976 100644 --- a/internal/routes/standby_ctrl/interval.go +++ b/internal/routes/standby_ctrl/interval.go @@ -28,6 +28,8 @@ func Interval(interval int64, play func(c context.Context) error) func(c context case <-c.Done(): return nil default: + // 避免忙循环,短暂休眠 + time.Sleep(10 * time.Millisecond) } } }