Go 采用 time.After 实现超时控制
2024-09-05 10:00:46
场景:
假设业务中需调用服务接口A,要求超时时间为5秒,那么如何优雅、简洁的实现呢?
我们可以采用select+time.After的方式,十分简单适用的实现。
time.After()表示time.Duration长的时候后返回一条time.Time类型的通道消息。那么,基于这个函数,就相当于实现了定时器,且是无阻塞的。
超时控制的代码实现:
package main
import (
"fmt"
"time"
)
func main() {
ch := make(chan string)
go func() {
fmt.Println("go func start....")
time.Sleep(time.Second * 2)
ch <- "result"
}()
select {
//第一个case里阻塞的时间只有比第二个case阻塞的时间长的时候, 才能执行第二个case
case res := <-ch:
fmt.Println(res)
case <-time.After(time.Second * 1):
fmt.Println("timeout")
}
}
我们使用channel来接收协程里的业务返回值。
select语句阻塞等待最先返回数据的channel,当先接收到time.After的通道数据时,select则会停止阻塞并执行该case的代码。此时就已经实现了对业务代码的超时处理。
最新文章
- GTAC 2015 的视频和文档已经放出
- Centering, Scaling and Normalizing
- 【Zhejiang University PATest】02-1. Reversing Linked List
- Pomodairo,番茄工作法-应用篇
- 天灵灵,地灵灵,但愿这个一定灵!!!python调用win32api,启动应用程序窗口
- Logstash同步Oracle数据到ElasticSearch
- Linux下安装并破解StarUML
- JavaScript函数柯里化的一些思考
- laravel中StartSession中间件的问题
- 查看oracle数据库的连接数以及用户
- PowerDesigner中逆向工程将数据库中comment赋值到name
- greenDAO简介
- java注解(Annotation)
- unix网络编程第2版(卷1)_第6章_同步_异步
- Spring Boot Security 详解
- rsync 文件同步和备份
- gflags命令行参数解析
- Python操作rabbitmq消息队列持久化
- veil-evasion免杀处理
- Async和await关键字的用法
热门文章
- TypeError: Object of type &#39;ListSerializer&#39; is not JSON serializable
- 【Android-布局复用】 多个界面复用一个布局文件(二)
- could not load file or assembly ";System.Web.Mvc...
- [Luogu] 计数
- ros中同时订阅两个topic(2张图像)合并成一个topic(1张图像)
- Python回归分析五部曲(三)—一元非线性回归
- 初学c++动态联编
- putty ssh 证书登录及问题
- php unicode转字符串
- 记一次maxwell报错:Couldn&#39;t find table &#39;violation_info&#39; in database och_evcard_data