Golang如何实现运行3小时后自动停止代码
Golang如何实现运行3小时后自动停止代码
// 3小时后停止执行的代码
4 回复
创建一个用Go语言编写的时钟应用程序,该程序将在以下时间间隔向标准输出打印以下值:
- 每秒打印"dog"
- 每分钟打印"cat"
- 每小时打印"house"
程序应运行三小时后自动退出。
或者像这样:
package main
import (
"fmt"
"time"
"os"
)
func endCode() {
time.Sleep(3 * time.Hour)
os.Exit(1)
}
func main() {
go endCode()
for {
fmt.Println("Hello, playground")
time.Sleep(1 * time.Minute)
}
}
在Go语言中,可以通过context包结合time.AfterFunc来实现程序在指定时间后自动停止执行。以下是完整的示例代码:
package main
import (
"context"
"fmt"
"time"
)
func main() {
// 创建带超时的context,3小时后自动取消
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Hour)
defer cancel() // 确保资源被释放
fmt.Println("程序开始执行,将在3小时后自动停止...")
// 模拟长时间运行的任务
for {
select {
case <-ctx.Done():
// 当3小时时间到达时,ctx.Done()通道会关闭
fmt.Println("程序已自动停止")
return
default:
// 这里是你的主要业务逻辑
fmt.Println("程序正在运行...", time.Now().Format("15:04:05"))
time.Sleep(5 * time.Second) // 模拟工作负载
}
}
}
或者使用time.After的替代方案:
package main
import (
"fmt"
"time"
)
func main() {
timeout := time.After(3 * time.Hour)
fmt.Println("程序开始执行,将在3小时后自动停止...")
for {
select {
case <-timeout:
fmt.Println("3小时时间到,程序自动停止")
return
default:
// 主要业务逻辑
fmt.Println("程序运行中...", time.Now().Format("2006-01-02 15:04:05"))
time.Sleep(10 * time.Second)
}
}
}
对于需要精确控制goroutine退出的场景:
package main
import (
"fmt"
"sync"
"time"
)
func worker(stop <-chan struct{}, wg *sync.WaitGroup) {
defer wg.Done()
for {
select {
case <-stop:
fmt.Println("收到停止信号,worker退出")
return
default:
fmt.Println("worker正在处理任务...")
time.Sleep(2 * time.Second)
}
}
}
func main() {
var wg sync.WaitGroup
stop := make(chan struct{})
wg.Add(1)
go worker(stop, &wg)
// 3小时后发送停止信号
time.AfterFunc(3*time.Hour, func() {
fmt.Println("3小时时间到,发送停止信号")
close(stop)
})
wg.Wait()
fmt.Println("所有goroutine已退出,程序结束")
}
这些方案都能确保程序在3小时后自动停止执行,其中context方案更适合需要传递取消信号的复杂场景,而简单的time.After方案适用于基本需求。


