首页 > 其他分享 >go三种超时退出方法

go三种超时退出方法

时间:2023-12-01 20:34:37浏览次数:26  
标签:Println fmt Go 三种 context time go 超时

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 之间传递取消信号的方式,以及设置超时。

以下是三种常见的实现超时退出的方式:

使用time.Afterselect

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.")
}
}

使用time.Afterchan

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.")
}
}

使用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.Afterselect或者使用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

相关文章

  • go读写锁
    go读写锁互斥锁每次只让一g通过,去读写数据。但是读数据操作,并发其实没有问题。所以诞生了读写锁。读协程可以并发,一起读。但是写协程还是要走互斥锁,只能一个个通过。先加了读锁先加了读锁。那么写的协程,就需要去休眠队列中等待。一直到读锁都释放。先加了写锁这个时候,......
  • 记一次vscode 打开go项目的处理方式
    问题:需要用vscode打开没有用go.mod管理的项目打包项目为linux执行的二进制文件vscode全局settings.json配置{"go.formatTool":"gofmt","go.gopath":"D:\\GoPath;","go.goroot":"D:\\GO","go.lintTool&......
  • jwt在go中的应用
    官网JWT什么是JWT在现代的Web应用开发中,目前已经有大半部分的应用都是使用的jwt的方式来做登录鉴权功能,那么什么是jwt呢?JSONWebToken(JWT)是一个开放标准RFC519,它定义了一种紧凑且自包含的方式,用于作为JSON对象在各方面之间安全地传输信息;JWT是一个数......
  • Django补4
    过滤器写一个过滤器---》一堆内容---》经过过滤器后---》把关键词屏蔽#自定义过滤器{{变量|过滤器名字}}编写步骤1注册app2在某个app下:创建templatetags模块(模块名只能是templatetags)3在包下写一个py文件,随便命名4在py文件中:写入fromdjangoimporttemplateregister=t......
  • GORM学习
    Day1:GORM入门1.环境的安装在项目文件的terminal中输入下面两条命令进行gorm安装gogetgorm.io/driver/mysqlgogetgorm.io/gorm2.安装好之后使用以下代码进行检测,其中的地址拼接是重点"%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local&timeout=%s",us......
  • Google Play 结算系统
    技术GooglePlay。供用户下载应用及其他数字商品的在线商店。GooglePlay管理中心。提供界面,供您将应用发布到GooglePlay的平台。GooglePlay管理中心还会显示您的应用详情,包括您通过GooglePlay销售的任何商品或内容。GoogleCloud控制台。用于管理后端API(例如Google......
  • Go--命名规则
    在Go语言中,项目名和文件名的命名规则有一些建议和惯例。以下是一些常见的规则和最佳实践:项目名:项目名应该简短、有意义,并能够清晰地表达项目的目的或功能。项目名通常使用小写字母,使用连字符或下划线分隔单词。项目名不应包含特殊字符或空格。项目名应尽量避免与现有的库......
  • Google Play 允许区块链游戏和 NFT 应用进入平台
    为GameFi用户在地域分布与手机机型分布方面与GooglePlay 有众多契合之处:地域分布:东南亚地区用户占比最大,2022年上半年东南亚用户占比达到41%其次是北美和西欧地区用户,2022年上半年占比分别为16%和15%发展中国家用户占比也在快速增长,如菲律宾、越南、印度等机......
  • MongoTemplate操作MongoDB
    集成简介spring-data-mongodb提供了MongoTemplate与MongoRepository两种方式访问mongodb,MongoRepository操作简单,MongoTemplate操作灵活,我们在项目中可以灵活适用这两种方式操作mongodb,MongoRepository的缺点是不够灵活,MongoTemplate正好可以弥补不足。搭建开发环境1、创建springbo......
  • go锁基础 - atomic、sema
    atomic和sema是实现go中锁的基础,简单看下他们的实现原理。atomic`atomic常用来作为保证原子性的操作。当多个协程,同时一个数据进行操作时候,如果不加锁,最终的很难得到想要的结果。varpint64=0funcadd(){ p=p+1}funcmain(){ fori:=0;i<10......