[go语言基础]关于上下文机制

这篇具有很好参考价值的文章主要介绍了[go语言基础]关于上下文机制。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

关于什么为上下文机制

一般来说,我们如果想要在多个进程中监听彼此,最常用的方法就是使用管道进行监听

例如最常用的,想要在进程之间传递某个进程已经完成的信号,我们经常使用通道的方式进行传递消息.

举个例子,一个进程B想要监听另一个进程A,可以通过一个管道进行监听,B中使用for和select结合来监听管道是否关闭.A进程执行完自己的任务以后,对管道进行close操作,此时B即可得知A的关闭

这种操作方法不是很优雅,而且会遇到一些特殊的情况,比如想要监听某个嵌套进程?这就会很麻烦

上面这种情况,就是上下文之一的"带有取消类型的上下文"的使用情景,接下来我们一共会介绍四种类型的上下文

1.上下文的基本定义'

在其他语言中,上下文对象指的是调用某个方法,属性的背景,通常指的是this这种东西

但是在golang中,Context译为上下文,是Go提供的一种并发控制的解决方案,相比于管道和WaitGroup,它可以更好的控制子孙协程以及层级更深的协程。Context本身是一个接口,只要实现了该接口都可以称之为上下文例如著名Web框架Gin中的gin.Contextcontext标准库也提供了几个实现,分别是:

  • emptyCtx
  • cancelCtx
  • timerCtx
  • valueCtx

他们都是基于一个接口实现的,该接口中一共有四个基本方法 ,根据不同的上下文对象的细分类型使用

type Context interface {
   
   Deadline() (deadline time.Time, ok bool)

   Done() <-chan struct{}

   Err() error

   Value(key any) any
}

//上下文的几种类型
//首先context这个接口,以及一个儿子三个孙子,都完成了四个方法
//1.deadline 确定一个ddl
//2.Done 返回一个只读流,这个可以监听接口是否被取消
//3.Err 返回一个错误类型
//4.Value 内嵌一个键,可以返回一个数据
//这几个方法对应了不同的类型

2.关于这些上下文对象的具体使用

(1)emptyCtx

可以通过如下两种方法直接调用空的ctx对象

这两种方法创建出的空对象页经常作为下面三种的父上下文

func TestEmptyCtx() {
	//第一种类型,空的context对象,没啥东西
	//两种方式直接返回空的emptyCtx对象
	context.Background()
	context.TODO()
}

(2)valueCtx

valueCtx,主要用来传递一些数据

一个valueCtx对象能保存一共键值对

func TestValueCtx() {
	//ctx主要用来在协程和子协程中传递数据
	ctx := context.WithValue(context.Background(), "key", "value")
	go func(ctx context.Context) {
		//读取ctx中的东西
		fmt.Println("valueCtx中的数值为", ctx.Value("key"))
	}(ctx)
	//下面暂时休眠一秒,让主线程能正常运行
	time.Sleep(time.Second)
}

//valueCtx的内部实现很简单,里面只有三个属性
//context key value   只能存储一个键值对
//实现了方法 Value(key),如果在这个上下文找不到,就会往父类的上下文找

(3)cancelCtx

带有取消方法的ctx对象,在创建的时候会自动生成一共cancel方法

一旦调用这个方法,ctx对象中的Done管道就会被截止,其他进程就可以监听到这个上下文消息的结束

func TestCancelCtx() {
	ctx, cancel := context.WithCancel(context.Background())
	go func(ctx context.Context) {
		fmt.Println("正在取消上下文")
		time.Sleep(time.Second)
		cancel()
	}(ctx)
	for {
		select {
		case <-ctx.Done():
			{
				fmt.Println("检测到上下文被关闭")
				return
			}
		}
	}
}

(4)timerCtx

在原本的带有取消方法的基础上,新增了定时文章来源地址https://www.toymoban.com/news/detail-486765.html

func TestTimerCtx() {
	//timerCtx的创建有两种函数
	//withDeadline(.....,具体截止时间)    //比如某年某月某分某秒
	//withTimeout(.....,手动定义时间间隔)  //比如五分钟
	//这里手动设置过期时间为一秒
	ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(time.Second))
	defer cancel()
	//返回的两个东西,cancel仍然是可以手动进行取消
	//ctx是内置的退休时间的
	wait := sync.WaitGroup{}
	wait.Add(1)
	go func(ctx context.Context, wait *sync.WaitGroup) {
		count := 1
		for {
			select {
			case <-ctx.Done():
				{
					fmt.Println("寄了")
					wait.Done()
					return
				}
			default:
				fmt.Println("你要黄的粉的", count)
				count += 1
			}
		}
	}(ctx, &wait)
	wait.Wait()
}

到了这里,关于[go语言基础]关于上下文机制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • linux 基础知识3---上下文

    1、什么是上下文切换? 用户态进入内核态时,进程要传递很多变量、参数给内核, 内核态也要保存用户进程的一些寄存器值,变量等。所谓的进程上下文,可以看作是 用户进程传递给内核的这些参数以及内核要保存的那一套的变量和寄存器和当时的环境 等。 一个进程上下

    2024年02月07日
    浏览(26)
  • 现有大语言模型(ChatGPT)的上下文理解能力还是假象吗?

    人工智能的一个重要方面是人机交互智能,人机交互智能的核心在于机器对自然语言的理解,而机器翻译是衡量这种理解的有效方式。 按照目前LLM的技术路线,仅仅靠计算语言形式的概率能否产生人类式理解还是未知,但我们知道人类式理解是能够反语言形式概率的,这可以

    2023年04月15日
    浏览(28)
  • 大语言模型之十六-基于LongLoRA的长文本上下文微调Llama-2

    增加LLM上下文长度可以提升大语言模型在一些任务上的表现,这包括多轮长对话、长文本摘要、视觉-语言Transformer模型的高分辨4k模型的理解力以及代码生成、图像以及音频生成等。 对长上下文场景,在解码阶段,缓存先前token的Key和Value(KV)需要巨大的内存开销,其次主流

    2024年02月06日
    浏览(28)
  • 【python】flask执行上下文context,请求上下文和应用上下文原理解析

    ✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN新星创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开

    2024年03月26日
    浏览(38)
  • 超长上下文处理:基于Transformer上下文处理常见方法梳理

    原文链接:芝士AI吃鱼 目前已经采用多种方法来增加Transformer的上下文长度,主要侧重于缓解注意力计算的二次复杂度。 例如,Transformer-XL通过缓存先前的上下文,并允许随着层数的增加线性扩展上下文。Longformer采用了一种注意力机制,使得token稀疏地关注远距离的token,从而

    2024年02月13日
    浏览(39)
  • 从零开始理解Linux中断架构(7)--- Linux执行上下文之中断上下文

            当前运行的loop是一条执行流,中断程序运行开启了另外一条执行流,从上一节得知这是三种跳转的第三类,这个是一个大跳转。对中断程序的基本要求就是 中断执行完毕后要恢复到原来执行的程序 ,除了时间流逝外,原来运行的程序应该毫无感知。        

    2024年02月11日
    浏览(47)
  • 执行上下文

    通过var定义(声明)的变量--在定义语句之前就可以访问到 值为undefined 通过function声明的函数--在之前就可以直接调用 值为函数定义(对象) 全局代码 函数(局部)代码 在执行全局代码前将window确定为全局执行上下文 对全局数据进行预处理 var定义的全局变量--undefined--添加

    2023年04月20日
    浏览(32)
  • 上下文切换性能篇

    现代操作系统都是多任务的分时操作系统,也就是说同时响应多个用户交互或同时支持多个任务处理,因为 CPU 的速度很快而用户交互的频率相比会低得多。所以例如在 Linux 中,可以支持远大于 CPU 数量的任务同时执行,对于单个 CPU 来说,其实任务并不是在同时执行,而是操

    2024年02月15日
    浏览(38)
  • CPU上下文切换

    CPU 上下文切换,就是先把前一个任务的 CPU 上下文(也就是 CPU 寄存器和程序计数器)保存起来,然后加载新任务的上下文到这些寄存器和程序计数器,最后再跳转到程序计数器所指的新位置,运行新任务。 CPU 的上下文切换就可以分为几个不同的场景,也就是进程上下文切换、

    2024年02月14日
    浏览(26)
  • js执行上下文

    创造执行上下文,是为了把变量声明给保存下来,在执行时,好找到变量用 看代码要分执行前(构建执行上下文)和执行时去看 执行上下文的组成 1、词法环境:[全局对象]、scope、outer 2、This Binding:提供this的访问 构建执行上下文 1、处理声明 2、检查重复定义 3、初步赋值

    2024年02月02日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包