上一篇文章“ GO语言高级平行设备系列2:GO语言代表基础知识”介绍了同时控制的频道和同步软件包。
让我们在本文中学习上下文。
GO 1.7标准库介绍上下文。Context可用于传递Goroutine之间的上下文信息,包括:取消信号,超时信号,截止日期,K-V数据等。
相同的上下文可以传递给多个goroutine,而goroutine可以安全。
,您可以创建上下文
,可以创建儿童环境
现在,上下文是Goroutine并发控制和超时控制的标准实践。
您在这里看到两张脸吗?没关系,低头看,稍后慢慢介绍。
GO通常用于后端服务,例如我们设置HTTP服务器。
HTTP服务器从客户端接收了许多请求。从类似地说,当收到请求时,将同时进行几项Goroutine工作,有些则转到数据库以获取数据,有些则可以调用下游接口...
这些goroutine可以形成树状的地图:
这些Goroutine通常共享一些数据,例如登录令牌。如果请求中断,例如浏览器关闭,执行超时等,则应及时关闭此请求相关的Goroutine。需要的是,当这些goroutine退出时,系统可以回收资源。
如果Goroutine未及时关闭怎么办?
假设由于某些原因,请求中的goroutine变得非常慢。请求超时,用户可能会收到错误的网关请求时间,但是此时,服务内部goroutine尚未及时关闭,并且仍将是在后台默默执行。
如果该请求继续进行,则Goroutine的数量将继续增加,直到系统资源用完,甚至服务器都关闭,并且服务无法可用。
在旅途中,Goroutine不能直接在外部关闭,您需要通过Goroutine本身退出。将非常麻烦,也很容易产生错误。通过上下文控制它更方便。
正如我之前说的那样,我们可以看到在请求中创建了几个Goroutine作为树。
现在,我们为该树的每个节点带来一个上下文,以获取上下文树。
在此上下文中的节点树可以是父亲上下文的副本或相同的上下文。
左侧是goroutine树,右边是相应的上下文树
当上下文是超时的,或通过取消。与ITS相关的潜台词也将同时取消。
在 - 左冰冰的红色上下文触发取消后,它将从父亲的上下文中删除,并且其子女上下文将被取消。在右侧的图片上,圈出的零件都是取消的,父亲和父亲之间的关系儿子不再存在。
有两种创建上下文的方法:
通过这两种方法获得的结果是相同的,但它们只是别名,它们是植根的。
加班控制
儿童上下文到期后将自动取消上下文。您还可以通过执行Cancelfunc手动取消上下文。
与CCANCEL
创建子上下文并返回取消功能。执行取消功能可以手动取消上下文。
与价值
Value接收K,V参数,创建一个新的上下文并在上下文上保存K,V。新上下文将指向其父亲上下文。如果您多次多次执行多次,则将获得诸如链接列表之类的上下文字符串。
当从上下文中获取值时,将沿链接找到该值,直到找到相应的k为止。
创建3 Goroutine并创建3个上下文控制goroutine到达结束
输出:
上下文为我们定义了四种类型的正方形
上下文的使用可以有效,并简单地实现控制goroutine的目的。
在下一篇文章中,我们将讨论一些共同的并发模式。
顾名思义,并行模式是Goroutine的某种使用。
原始:https://juejin.cn/post/7096105924502224904