当前位置: 首页 > 网络应用技术

GO语言高并发系列三:上下文

时间:2023-03-07 15:42:42 网络应用技术

  上一篇文章“ 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