首页 > 其他分享 >golang context.Context 使用示例

golang context.Context 使用示例

时间:2024-05-30 17:33:30浏览次数:26  
标签:Context 示例 WithDeadline WithValue time ctx golang context Background

context 在golang程序中经常被用到,它可以被用来携带一些变量,例如requestID,也可以用来做运行控制,比如Timeout Deadline,或者人为逻辑控制Cancel。

本实例程序用来简单展示各个context的使用方法。

package main

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

type CtxKey string

var (
	KEY CtxKey = "with_value_key"
)

// 几种context的使用方法
func main() {
	// context.WithValue
	// WithValue可以使得我们在context对象中携带某种上下文数据,例如requestID。
	// 这种上下文数据可以是多个,通过多次调用WithContext实现,例如:
	// ctx := context.WithValue(context.Background(), Key1, Value1)
	// ctx = context.WithValue(ctx, Key2, Value2)
	// v1 := ctx.Value(Key1) -> Value1
	// v2 := ctx.Value(Key2) -> Value2
	// 需要注意的是Key 应该是内置类型,比如以上定义的CtxKey 类型
	ctx1 := context.WithValue(context.Background(), KEY, "my_value")
	v := ctx1.Value(KEY)
	log.Printf("value of %s in context: %s", KEY, v)

	// context.WithTimeout
	// 设置程序的执行超时时长。
	ctx2, cancel2 := context.WithTimeout(context.Background(), time.Duration(1*time.Second))
	loopUntil(ctx2)
	defer cancel2()

	// context.WithDeadline
	// WithDeadline 和WithTimeout类似,不同的是WithDeadline传入的是一个时间点,而不是时长。
	ctx3, cancel3 := context.WithDeadline(context.Background(), time.Now().Add(time.Second))
	loopUntil(ctx3)
	defer cancel3()

	// context.WithCancel
	// WithCancel用于 主动cancel控制
	ctx4, cancel4 := context.WithCancel(context.Background())
	go loopUntil(ctx4)
	<-time.After(1 * time.Second)
	cancel4()

	//context.With*Cause
	// With*Cause包括 WithCancelCause WithTimeoutCause WithDeadlineCause
	// 用于告知cancel的原因
	ctx5, cancel5 := context.WithCancelCause(context.Background())
	go loopUntil(ctx5)
	<-time.After(1 * time.Second)
	cancel5(fmt.Errorf("cancelled with no reason in main thread"))

	// delay quitting main func
	<-time.After(100 * time.Millisecond)
}

func loopUntil(ctx context.Context) {
	for {
		select {
		case <-time.After(300 * time.Millisecond):
			log.Println("running after 300 milliseconds")
		case <-ctx.Done():
			log.Printf("stop triggered, cause: %s", context.Cause(ctx))
			return
		}
	}
}

标签:Context,示例,WithDeadline,WithValue,time,ctx,golang,context,Background
From: https://www.cnblogs.com/zongzw/p/18222852

相关文章

  • 三十二、openlayers官网示例解析Draw lines rendered with WebGL——使用WebGL动态修
     官网demo地址:DrawlinesrenderedwithWebGL这个示例展示了如何用webgl渲染矢量图形并动态修改点、线属性。首先先把基本的地图加载上去initMap(){this.map=newMap({layers:[newTileLayer({source:newXYZ({......
  • golang开发 gorilla websocket的使用
    很多APP都需要主动向用户推送消息,这就需要用到长连接的服务,即我们通常提到的websocket,同样也是使用socket服务,通信协议是基本类似的,在go中用的最多的、也是最简单的socket服务就是gorilla/websocket,它有21.1K的star,足以说明它的受欢迎程度,它的github地址是https://github.com/g......
  • CSS3媒体查询与页面自适应示例
    CSS3媒体查询(MediaQueries)是CSS的一个强大功能,它允许你根据设备的特性(如视口宽度、分辨率等)来应用不同的样式。这在创建响应式网站(即能自动适应不同屏幕尺寸和设备的网站)时非常有用。以下是一个简单的CSS3媒体查询和页面自适应的示例:首先,我们假设有一个简单的HTML结构:<!DOCTY......
  • AnyCAD中的Editor示例代码学习1
    AnyCADRapidSDK(ARS)是一个包含三维几何造型、图形显示、数据管理等模块综合三维图形平台,支持Windows、Linux、MacOS多操作系统,支持.NET、Python、Java多开发语言,可以用于开发CAD/CAE/CAM/SIM应用程序,用于机械、建筑、电力、教育、机器人、科学计算等领域。目前计划基于Anyc......
  • 1.1 Golang 初识
    1.1.1简介Go(又称Golang)是Google的RobertGriesemer,RobPike及KenThompson开发的一种计算机编程语言1.1.2设计初衷Go是一种编译型语言,可以进行快速开发,解决c/c++项目太慢内存泄漏等问题。有着很强的并发能力以及极低的内存消耗。1.1.3应用领域1.Go服务器端/游戏软件......
  • .NET|--WPF|--如何使用LINQPad创建一个WPF示例
    1.安装包管理器#搜索框内需要填入↓"id=Microsoft.NETCore.App""id=Microsoft.WindowsDesktop.App.Ref"2.代码voidMain(){ varapp=newSystem.Windows.Application(); varmainWindow=newSystem.Windows.Window { Title="SimpleWPFProgra......
  • golang reflect 常见示例
    reflect是golang中元编程的能力体现。需要注意的是,reflect尽量不用,有性能问题,也有避免滥用的考虑。packagemainimport( "log" "reflect")typeAstruct{ aint bstring cbool}//实验reflect的相关函数funcmain(){ typeValue() callFunc()}funcother......
  • 通栏中不定数量的图片/轮播自适应宽高的简单示例
    最近接到一个需求,在一个页面会有多个通栏,每个通栏中会有不固定数量的图片或轮播图,要求各图片/轮播要同等比例自适应宽高,写成通用代码。示意图:光是图片好说,其中有swiper就会比较麻烦。代码:<divclass="container"><divclass="zt_banner"><divclass="swiper">......
  • Python-使用OpenCV(二)_第一个示例程序
    1、创建项目2、创建代码importcv2#加载图片image=cv2.imread("C:\\Users\\Administrator\\Pictures\\Screenshots\\20240311220733.png")#显示图片cv2.imshow("Image",image)#等待任意键被敲击cv2.waitKey(0)#关闭所有窗口cv2.destroyAllWindows()3、结......
  • golang errgroup 的作用
     errgroup是Go中用于并发控制和错误处理的一个工具,提供了一种方便的方式来协调多个goroutine。它允许你在一个组中运行多个goroutine,并等待它们全部完成,同时收集和返回第一个发生的错误。它的主要作用包括:同步:errgroup.Group提供了一个Wait方法,这个方法会阻塞调......