Golang实现 超时退出 有哪三种方式,你知道吗?
原创 磊丰 Go语言圈 2023-11-21 08:30 发表于美国 收录于合集#学Go语言哪些事儿241个 MySQL大牛 带你全面剖析与系统梳理数据库(mysql等)知识分享,总结数据库技巧和方法,提升你的技术技能。 45篇原创内容 公众号学习与交流: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,我该如何去开始? 阅读 1470 Go语言圈 写留言
人划线
标签:Println,fmt,Go,三种,context,time,go,超时 From: https://www.cnblogs.com/cheyunhua/p/17870816.html