首页 > 其他分享 >golang 中常用的超时控制的方案示例

golang 中常用的超时控制的方案示例

时间:2023-04-21 14:34:34浏览次数:40  
标签:func 示例 After golang context time go 超时

go 中,我们很容易就可以实现超时控制,今天分享2种解决方案:

  • 1.select + time.After
  • 2.select + context

其实两种方案中,我们都是通过 channel 来控制的,在方案1中,对于 time.After, 通过返回一个只读 <- chan Time 实现,而 context 中,则通过 context.Done() 实现,通过返回 <- chan struct{} 信号实现,

下面看看函数签名:
time.After
可以看到,只需要传入一个时间的duration即可。

// go1.19/src/time/sleep.go
func After(d Duration) <-chan Time {
	return NewTimer(d).C
}

context.Done
这其实是通过实现 context接口的 timeCtx

接下来看看超时控制的相关代码实现。

1.select + time.After

package main

import (
	"context"
	"fmt"
	"time"
)

func main()  {
	fmt.Printf("[%s] start...\n", time.Now().Format(time.RFC3339))
	taskCh := make(chan int)
	go func() {
		time.Sleep(5*time.Second)
		taskCh <- 1
	}()

	select {
	case data := <- taskCh:
		fmt.Println(data)
	case <- time.After(time.Second):
		fmt.Println("timeout!")
	}
	fmt.Printf("[%s] end...\n", time.Now().Format(time.RFC3339))
}

我们通过实现一个耗时的task实现任务耗时,在time.After中传入1s的超时,到1s时,该case先收到信号,从而结束整个执行。

2.select + context

package main

import (
	"context"
	"fmt"
	"time"
)

func main()  {
	fmt.Printf("[%s] start...\n", time.Now().Format(time.RFC3339))
	ctx, cancel := context.WithTimeout(context.Background(), 3 * time.Second)
	defer cancel()
	taskCh := make(chan int)
	go func() {
		time.Sleep(5*time.Second)
		taskCh <- 1
	}()

	select {
	case data := <- taskCh:
		fmt.Println(data)
	case <- ctx.Done():
		fmt.Println("timeout!")
	}
	fmt.Printf("[%s] end...\n", time.Now().Format(time.RFC3339))
}

类似于上一个方案,我们只是在context中传入3s的超时时长,到了时间后,就会收到 ctx.Done(),进而结束执行。

标签:func,示例,After,golang,context,time,go,超时
From: https://www.cnblogs.com/davis12/p/17340259.html

相关文章

  • Spring中Redis存取数据示例
    1.导入StringRedisTemplate类importorg.springframework.data.redis.core.StringRedisTemplate;2.自动装配@AutowiredprivateStringRedisTemplatestringRedisTemplate;3.存数据(设置5分钟过期)Stringtoken=UUID.randomUUID().toString();Stringkey=RedisPrefix......
  • C#基础 ref out 函数参数 不算重载的简单示例
     .NETFramework:4.7.2       IDE:VisualStudioCommunity2019        OS:Windows10x64    typesetting:Markdown codeusingSystem;namespaceConsoleApp{classProgram{staticvoidMain(string[]args){......
  • C#基础 out 函数参数为out int类型 简单示例
     .NETFramework:4.7.2       IDE:VisualStudioCommunity2019        OS:Windows10x64    typesetting:Markdown codeusingSystem;usingSystem.Linq;namespaceConsoleApp{classProgram{publicstaticvoidMyFun(int......
  • C#中的分布式ID生成组件IDGen介绍并给出示例代码
    C#中的IDGen是一个C#实现的TwitterSnowflake算法的ID生成器,可以生成全局唯一的ID,支持高并发场景下的ID生成。在本篇文章中,我们将介绍IDGen的使用方法并提供相关的C#示例代码。IDGen的介绍IDGen是一款开源的分布式唯一ID生成器,支持多种ID生成算法,并且可以在高并发场景下快速生成......
  • k8s deployment资源部署java以及skywalking agent示例
    catdeploy.ymlapiVersion:apps/v1kind:Deploymentmetadata:name:app-namenamespace:your-namespaceannotations:kubernetes.io/change-cause:2.11.0-SNAPSHOT-20230420-46#版本说明-用于回滚等labels:app:app-namespec:replicas:1sel......
  • Java架构师在项目中的经验描述示例
    以下是一个Java架构师在项目中的经验描述示例:项目名称:XXX系统项目描述:该项目是一个基于微服务架构的电商平台,涵盖了商品管理、订单管理、支付管理、会员管理等多个模块。作为Java架构师,负责系统的整体设计和开发工作。项目职责:设计并实现了整个系统的微服务架构,包括服务拆分、......
  • Qt编写推流综合应用示例(文件推流/桌面推流/本地摄像头/网络摄像头/转发推流/视频分发)
    一、功能特点1.1文件推流指定网卡和监听端口,接收网络请求推送音视频等各种文件。实时统计显示每个文件对应的访问数量、总访问数量、不同IP地址访问数量。可指定多种模式,0-直接播放、1-下载播放。实时打印显示各种收发请求和应答数据。每个文件对应MD5加密的唯一标识符,用......
  • node可以用nvm快速切换版本,golang如何快速切换版本?用gvm就行。
    使用gvm可以带来以下好处:快速切换Golang版本,方便进行版本测试和开发;可以在多个项目中同时使用不同版本的Golang包和工具,避免冲突;可以通过gvm管理不同版本的Golang,方便安装、卸载和更新;可以自由选择Golang的镜像源,下载更快。我使用的是win1064位系统,所以只考虑w......
  • 设计模式-模板模式在Java中的使用示例-悍马模型制造示例
    场景设计模式-模板模式在Java中的使用示例:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/130230732上面整理了模板模式的使用示例,为加强理解特记录另一个使用示例,以下示例摘自设计模式之禅第二版。模板方法模式定义一个操作中的算法的框架,而将一些步骤延迟到......
  • 引起SQL数据库超时的问题分析及解决办法
    1.由于数据库设计问题造成SQL数据库新增数据时超时 症状: MicrosoftOLEDBProviderforSQLServer错误'80040e31'([ODBCSQLServerDriver]超时已过期); 服务器上看CPU、内存占用率很低; 事件日志中提示:数据库'*********'中文件'***********'的自动增长在453......