问题遇到的现象和发生背景
希望通过golang实现 这样的一直情况, 后台收到请求,开启一个goroutine进行复杂任务处理, 时间十分钟。
如果这十分钟内再次收到请求, 终止之前的goroutine, 重新开始一个任务处理。 怎么处理比较好
主要是想终止一个可能在执行的goroutine
希望通过golang实现 这样的一直情况, 后台收到请求,开启一个goroutine进行复杂任务处理, 时间十分钟。
如果这十分钟内再次收到请求, 终止之前的goroutine, 重新开始一个任务处理。 怎么处理比较好
主要是想终止一个可能在执行的goroutine
如果希望在收到新的请求时终止正在运行的 goroutine,可以使用带缓冲的通道来实现。
具体来说,可以在主 goroutine 中创建一个带缓冲的通道,并在新的 goroutine 中监听这个通道。当主 goroutine 收到新的请求时,就向通道中发送一个信号,告诉监听的 goroutine 终止运行。
下面是一个简单的示例代码实现:
package main
import (
"fmt"
"time"
)
func main() {
// 创建带缓冲的通道,用于发送信号
signal := make(chan struct{}, 1)
// 在新的 goroutine 中运行任务
go func() {
for {
// 监听通道,如果收到信号就终止运行
select {
case <-signal:
return
default:
}
// 运行复杂任务,模拟耗时 10 秒
fmt.Println("开始运行任务")
time.Sleep(10 * time.Second)
fmt.Println("任务运行完成")
}
}()
// 模拟每隔 5 秒收到一次请求
for {
time.Sleep(5 * time.Second)
fmt.Println("收到新的请求,终止之前的任务")
signal <- struct{}{}
}
}