场景:
假设业务中需调用服务接口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的代码。此时就已经实现了对业务代码的超时处理。

最新文章

  1. GTAC 2015 的视频和文档已经放出
  2. Centering, Scaling and Normalizing
  3. 【Zhejiang University PATest】02-1. Reversing Linked List
  4. Pomodairo,番茄工作法-应用篇
  5. 天灵灵,地灵灵,但愿这个一定灵!!!python调用win32api,启动应用程序窗口
  6. Logstash同步Oracle数据到ElasticSearch
  7. Linux下安装并破解StarUML
  8. JavaScript函数柯里化的一些思考
  9. laravel中StartSession中间件的问题
  10. 查看oracle数据库的连接数以及用户
  11. PowerDesigner中逆向工程将数据库中comment赋值到name
  12. greenDAO简介
  13. java注解(Annotation)
  14. unix网络编程第2版(卷1)_第6章_同步_异步
  15. Spring Boot Security 详解
  16. rsync 文件同步和备份
  17. gflags命令行参数解析
  18. Python操作rabbitmq消息队列持久化
  19. veil-evasion免杀处理
  20. Async和await关键字的用法

热门文章

  1. TypeError: Object of type &#39;ListSerializer&#39; is not JSON serializable
  2. 【Android-布局复用】 多个界面复用一个布局文件(二)
  3. could not load file or assembly &quot;System.Web.Mvc...
  4. [Luogu] 计数
  5. ros中同时订阅两个topic(2张图像)合并成一个topic(1张图像)
  6. Python回归分析五部曲(三)—一元非线性回归
  7. 初学c++动态联编
  8. putty ssh 证书登录及问题
  9. php unicode转字符串
  10. 记一次maxwell报错:Couldn&#39;t find table &#39;violation_info&#39; in database och_evcard_data