go三种超时退出方法
Golang实现 超时退出 有哪三种方式,你知道吗?
MySQL大牛
带你全面剖析与系统梳理数据库(mysql等)知识分享,总结数据库技巧和方法,提升你的技术技能。
公众号
学习与交流:Go语言技术微信群
商务合作加微信:LetsFeng
现在就开始你的Go语言学习之旅吧!人生苦短,let’s Go.
Goland 全家桶最新正式版激活码,支持版本升级
https://web.52shizhan.cn/activity/jump/link
在Go语言中,实现超时退出通常涉及到使用 context 包。context 包提供了一种在不同 Goroutine 之间传递取消信号的方式,以及设置超时。
以下是三种常见的实现超时退出的方式:
1 使用time.After
和select
:
package main
import (
"fmt"
"time"
)
func main() {
timeout := 5 * time.Second
done := make(chan bool)
go func() {
// 模拟耗时操作
time.Sleep(2 * time.Second)
done <- true
}()
select {
case <-done:
fmt.Println("Task completed successfully.")
case <-time.After(timeout):
fmt.Println("Timeout! The operation took too long.")
}
}
2 使用time.After
和chan
:
package main
import (
"fmt"
"time"
)
func main() {
timeout := 5 * time.Second
done := make(chan bool)
go func() {
// 模拟耗时操作
time.Sleep(2 * time.Second)
done <- true
}()
select {
case <-done:
fmt.Println("Task completed successfully.")
case <-time.After(timeout):
fmt.Println("Timeout! The operation took too long.")
}
}
3 使用context.WithTimeout
:
package main
import (
"context"
"fmt"
"time"
)
func main() {
timeout := 5 * time.Second
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
done := make(chan bool)
go func() {
// 模拟耗时操作
time.Sleep(2 * time.Second)
done <- true
}()
select {
case <-done:
fmt.Println("Task completed successfully.")
case <-ctx.Done():
fmt.Println("Timeout! The operation took too long.")
}
}
在这些例子中,我们使用了time.After
和select
或者使用context.WithTimeout
来实现超时退出。
第一种方式中,time.After
会在指定时间后向通道发送一个时间值,select
用于监听多个通道的操作。
第二种方式中,使用了context.WithTimeout
创建了一个带有超时的上下文,当操作耗时超过指定时间时,ctx.Done()
通道会被关闭。
文章首发:
更多相关Go语言的技术文章或视频教程,请关注本公众号获取并查看,感谢你的支持与信任!
收录于合集 #学Go语言哪些事儿
241个上一篇在docker里如何安装和部署golang下一篇Go语言实现开发一个简单的gRPC Demo,我该如何去开始?
Go语言圈
分类:
GO
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
2022-12-01 Go实现整合 Logrus 输出json格式日志
2022-12-01 golang流式编程(可选参数)
2021-12-01 你管这破玩意叫 IO 多路复用
2021-12-01 ensp 模拟 calico 跨网段 bgp 网络
2020-12-01 prometheus各种插件下载
2017-12-01 redis 一主二从三哨兵