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

news/2024/2/29 3:05:36

关于什么为上下文机制

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

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

举个例子,一个进程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() errorValue(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

在原本的带有取消方法的基础上,新增了定时

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 := 1for {select {case <-ctx.Done():{fmt.Println("寄了")wait.Done()return}default:fmt.Println("你要黄的粉的", count)count += 1}}}(ctx, &wait)wait.Wait()
}


http://www.ppmy.cn/news/361790.html

相关文章

ESXi 7.0 U3m NEC (日电) 定制版 OEM Custom Installer CD

VMware ESXi 7.0 Update 3m - 领先的裸机 Hypervisor (All OEM Customized Installer CDs) ESXi 7.0 U3m Standard (标准版) ESXi 7.0 U3m Dell (戴尔) 定制版 OEM Custom Installer CD ESXi 7.0 U3m HPE (慧与) 定制版 OEM Custom Installer CD ESXi 7.0 U3m Lenovo (联想) 定…

this 之谜揭底:从浅入深理解 JavaScript 中的 this 关键字(二)

前言 系列首发于公众号『前端进阶圈』 &#xff0c;若不想错过更多精彩内容&#xff0c;请“星标”一下&#xff0c;敬请关注公众号最新消息。 this 之谜揭底&#xff1a;从浅入深理解 JavaScript 中的 this 关键字&#xff08;二&#xff09; 调用位置 在理解 this 的绑定过…

Error:..\FreeRTOS\portable\RVDS\ARM_CM4F\port.c,768

出现这个报错的时候说明&#xff1a;刚刚发生的中断中调用了系统的API函数&#xff0c;但是该中断的优先级超出了系统可管理的优先级范围&#xff1b; 降低该中断的优先级或扩大系统可管理优先级范围即可解决。

Codeforces Round #768 (Div. 2) D题 Range and Partition

题面&#xff1a; 一句话题意&#xff1a;找一个闭区间 [x,y] &#xff0c;把数组a分成k段子串&#xff0c;每段子串中在区间 [x,y] 范围内的ai的个数严格大于在区间 [x,y] 范围之外的数的个数。 我们可以知道&#xff0c;k个段内 xy区间内的数的个数 至少 比区间外数的个数大…

骁龙768g和765g的差距大不大

骁龙768G可视为骁龙765G的鸡血加强版&#xff0c;CPU主频更高&#xff0c;图形性能更优&#xff0c;同时在7系产品中首次支持了GPU驱动独立升级更新。我用的手机就是活动时8折抢购的 点击开抢http://shouji.adiannao.cn/7 具体来说&#xff0c;骁龙768G基于7nm工艺打造&#xf…

Codeforces Round#768(Div.2) E. Paint the Middle

题意&#xff1a; 给定编号从 1 到 n的 n 个元素&#xff0c;元素 i 具有值 ai 和颜色 ci&#xff0c;最初,对于所有 i&#xff0c;ci0。 可以应用以下操作: 选取三个元素i、j、k&#xff08;1≤i<j<k≤n&#xff09;&#xff0c;使得ci、cj、ck都等于0且aiak&#xff0…

Codeforces Round #768 (Div. 2) C. And Matching

思路&#xff1a; 如果k不为n-1的话&#xff0c;就把k和n-1配&#xff0c;0和n-1-k配&#xff0c;其他相加为n-1就配一对 如果为n-1的话就把后四组和前四组单独配一下&#xff0c;其他相加为n-1配一对,尽量不要打乱中间的配对 Code #include <bits/stdc.h> // #define D…

Codeforces Round#768(Div.2) B. Fun with Even Subarrays

题意 给定一个数组&#xff0c;每次可以选择两个值分别作为起点和复制长度&#xff0c;l&#xff0c;k。For 例如a[2,1,3,4,5,3],选择l1&#xff0c;k2&#xff0c;然后a[1]a[3],a[2]a[4],a[3,4,3,4,5,3].问最少需要几步可以使得a中所有数字都相同 题解 1.尝试思考最终的数组…

Codeforces Round #768 (Div. 2) D. Range and Partition

题目链接 题意&#xff1a; 给定一个有n个整数的数组a&#xff0c;找到一个范围为[x,y] (x≤y)的值&#xff0c;并将a精确地分割成k个(1≤k≤n)子数组&#xff0c;如下所示:&#xff08;1&#xff09;每个子数组由a的几个连续元素组成&#xff0c;即对于某l和r(1≤l≤r≤n)&a…

PyTorch 深度学习 || 专题八:PyTorch 全连接网络分类

PyTorch 全连接网络分类 文章目录 PyTorch 全连接网络分类1. 非线性二分类2. 泰坦尼克号数据分类2.1 数据的准备工作2.2 全连接网络的搭建2.3 结果的可视化 1. 非线性二分类 import sklearn.datasets #数据集 import numpy as np import matplotlib.pyplot as plt from sklear…

【每日一题】768. 最多能完成排序的块 II

768. 最多能完成排序的块 II 参考k神题解就行,写的很详细: https://leetcode.cn/problems/max-chunks-to-make-sorted-ii/solution/zui-duo-neng-wan-cheng-pai-xu-de-kuai-ii-deng-jie-/ 辅助栈 排序块定义: 排序块 充分条件: 设此块中最大数字为 head , 若此块后面的所…

Codeforces Round #768 (Div. 2) A~C题解

Problem A&#xff1a; 本题大意为存在两个长度相等的数组a、b&#xff0c;任意选择索引i&#xff0c;交换数组ai&#xff0c;bi的值&#xff0c;使得a数组的最大值乘以b数组的最大值最小。 本题不难想到我们可以遍历数组&#xff0c;依次将比较大的放到a数组内&#xff0c;否…

Codeforces Round #768 (Div. 2) E. Paint the Middle

E. Paint the Middle 思路 每种元素都考虑的是最先出现和最后出现的那一段 1 9 2 1 10 8 3 2 5 4 3 区间&#xff1a;[1, 4], [3, 8], [7, 11] 1 2 3 1 2 3 区间&#xff1a;[1, 4], [2, 5], [3, 6] 1 2 3 1 5 6 2 1 区间&#xff1a;[1, 8], [2, 7] 1 2 1 2 7 4 7 区间&…

FreeRTOS报错:Error:..\FreeRTOS\port\RVDS\ARM_CM4F\port.c,768

FreeRTOS报错&#xff1a;Error:..\FreeRTOS\port\RVDS\ARM_CM4F\port.c,768 程序卡死在&#xff1a; configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) < ulMaxPRIGROUPValue ); 最终&#xff1a;优先级出错&#xff01; 这里说明了&#xff1a;说当这个…

Codeforces Round #768 (Div. 2)——A~B

A. Min Max Swap 题目链接 题意&#xff1a; 给定两个长度n 的数组a、b&#xff0c;元素都是正整数&#xff0c;目标求&#xff1a;两个数组的最大值的乘积的最小值&#xff0c;你可以进行的操作是&#xff1a;交换a[i], b[i]&#xff1b; 题解&#xff1a; 从已知情况分析&…

Codeforces Round #768(Div.2)(补题)

A-Min Max Swap 题意&#xff1a;给出两个数组&#xff0c;通过调换两个数组相同位置的数字&#xff0c;使得两个数组的最大值的成绩最小。 思路&#xff1a;两个数的乘积最小&#xff0c;所以尽量使两个数相差较大。同时遍历两个数组&#xff0c;比较两个数组同一个位置上的…

Codeforces Round #768 (Div. 2) A ~ E

C题及以后有详细的解释&#xff0c;AB略过&#xff1b; A 思路 不难想到&#xff0c;最大的放一边&#xff0c;最小的放另一边&#xff1b; Code #include <iostream> #include <cstring> #include <cstdio> #include <algorithm>using namespace …

Codeforces Round #768 (div1)(A~D)

这场因为明早有事就没更新&#xff0c;赛中过了A~C&#xff0c;D来不及写了&#xff0c;赛后5分钟码好提交2wa。。 A. And Matching&#xff08;思维分类讨论&#xff09; 开局想到的就是优先将 i~n-i-1 匹配&#xff0c;答案为0&#xff0c;之后以一次交换得出贡献值&#x…

Codeforces Round #768 (Div. 2)(A,B,C,D)

A. Min Max Swap 思路&#xff1a; 为了使两个序列最大值的乘积最小&#xff0c;我们可以将同一个位置比较大的元素全部放在系列a中&#xff0c;比较小的全部放在b中&#xff0c;这样两个序列最大值的乘积一定最小。 #include<bits/stdc.h> using namespace std; #define…

Codeforces Round#768(Div.2) F. Flipping Range

题意&#xff1a; 给定一个数组a&#xff0c;与一个集合B&#xff0c;每次可以选择集合B中的一个元素作为翻转a中一段的大小。使得 ∑ a i \sum a_{i} ∑ai​最大 题解&#xff1a; 如果我们有x、y∈B&#xff08;假设x>y&#xff09;&#xff0c;等价于拥有一个x-y大小置…
最新文章