Golang如何实现运行3小时后自动停止代码

Golang如何实现运行3小时后自动停止代码

// 3小时后停止执行的代码
4 回复

创建一个Go协程,在启动时获取时间戳,并定期与当前时间进行比较。如果时间戳相差3小时,则退出程序。

但还有更多方法可以实现这一需求。

更多关于Golang如何实现运行3小时后自动停止代码的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


创建一个用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方案适用于基本需求。

回到顶部