Go | 停止 Goroutine 有几种方法
Go | 停止 Goroutine 有几种方法
1、通过共享变量实现停止信号
可以使用一个共享的布尔变量或通道来传递停止信号给 Goroutine。Goroutine可以周期性地检查这个变量或通道,如果接收到停止信号,就主动终止执行。
例子:
package main
import (
"fmt"
"sync"
"time"
)
var stopSignal bool
func myGoroutine(wg *sync.WaitGroup) {
defer wg.Done()
for {
// 执行任务
fmt.Println("hahah beibei")
time.Sleep(time.Second * 1)
if stopSignal {
fmt.Println("接收到停止该goroutine信号")
break
}
}
return
}
func main() {
var wg sync.WaitGroup
wg.Add(1)
go myGoroutine(&wg)
time.Sleep(3 * time.Second)
// 停止Goroutine
stopSignal = true
wg.Wait()
}
2、使用带缓冲通道来传递停止信号
创建一个带缓冲的通道,通过向通道发送一个特定的停止信号来通知 Goroutine
终止执行。Goroutine 可以通过接收通道中的值来判断是否要停止执行。
var stopChan = make(chan bool, 1)
func myGoroutine2(wg *sync.WaitGroup) {
defer wg.Done()
for {
// 执行任务
fmt.Println("hahah2 beibei2")
time.Sleep(time.Second * 1)
select {
case <-stopChan:
fmt.Println("接收到停止该goroutine信号")
return
default:
// 继续执行任务
fmt.Println("继续执行任务")
}
}
}
func main() {
var wg sync.WaitGroup
wg.Add(1)
go myGoroutine2(&wg)
time.Sleep(3 * time.Second)
// 停止Goroutine
stopChan <- true
wg.Wait()
}
3、使用 context.Context 实现停止信号
context 包提供了一种用于跟踪 Goroutine 生命周期和传递取消信号的机制。可以使用 context.WithCancel 创建一个带有取消函数的上下文,然后在 Goroutine 中通过检查 ctx.Done() 的返回值来判断是否要停止执行。
func myGoroitine3ByContext(ctx context.Context, wg *sync.WaitGroup) {
defer wg.Done()
for {
// 执行任务
fmt.Println("hahah3 beibei3")
time.Sleep(time.Second * 1)
select {
case <-ctx.Done():
fmt.Println("接收到停止该goroutine信号", ctx.Err())
return
default:
// 继续执行任务
fmt.Println("继续执行任务")
}
}
}
func main() {
var wg sync.WaitGroup
wg.Add(1)
ctx, cancel := context.WithCancel(context.Background())
go myGoroitine3ByContext(ctx, &wg)
time.Sleep(3 * time.Second)
// 停止Goroutine
cancel() // 调用取消函数,取消上下文
wg.Wait()
}
请注意,以上方法只能向 Goroutine 发送停止信号,真正的终止或回收 Goroutine 是由 Go 运行时自动处理的。因此,停止信号只是一种请求 Goroutine 终止执行的机制。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
2019-05-27 Go输入输出格式化Printf
2019-05-27 HTTP-get和post的区别
2019-05-27 HTTP请求包和响应包
2019-05-27 CentOS7使用firewalld打开关闭防火墙与端口