上下文是GO语言的独特设计。在其他编程语言中很少见。在一句话中,上下文在GO语言中的作用是:
上下文提供了同一任务的多个goroutine之间的功能总和。
因此,如果您不需要上下文,您是否不能在GO语言中多goroutine之间实现信号通知和元数据传输?答案是:在简单的情况下,无法控制多级goroutine的控制。
让我们举个例子以了解上述段落
如果主要Coroutine中有多个任务,则主要Coroutine对这些任务具有超时控制。任务1具有多个子任务,并且任务1具有其自己的超时控制。Coroutine的取消信号还需要任务1的取消信号。
任务的成绩越深,goroutine的等级越难做信号感知和元数据共享。
因此,我们需要一个优雅的解决方案来实现这种机制:
为此,GO官员介绍了上下文,以实现上述1.7版中上述机制。
GO的上下文软件包提供了接口定义和类型上下文实现。我可以通过类图描述上下文提供的接口和类型。
通过上面的课程图,我们可以获取此信息
阅读了此类型的图表后,您可能会问如何在元数据之间传递上下文?毕竟,Valuctx仅带有钥匙值对。实际上,原理也很简单。它实施的值方法可以在整个上下文链接上找到指定键的值,直到返回根上下文为止。
通过寻找上下文携带的键值对的示意图,我们可以看到上下文链接的根节点是一个emptyCtx,这就是为什么未提供emptyctx的函数的原因。它用作根节点。
每当您需要将键值对添加到上下文链接中时,都必须根据上下文创建一个新的值存储键值对。电源的操作,因此上下文实现了线程安全性的数据共享机制,整个过程中没有锁,不会影响性能。
然后,“在取消上层任务后,所有下层任务将被取消。”“将取消中间的某个层的任务之后,当前任务的下层任务只会被取消,而不会影响上层任务和相同级别的同一任务。”如何实现上下文根据取消信号同步的关键点?
在cancelctx下方,TimErCTX统称为带有取消函数的上下文,示意图也将使用CANCELCTX标记来表示它们。
首先,创建时,仍然有必要根据父上下文节点创建以维护整个上下文链接的连续性。此外,您还将在上下文链接中找到先前的上下文,并将自己添加到它的孩子名单。
这样,在整个上下文链接中,除了父亲和儿子上下文之间的直接联系外,被取消的上下文还将在上下文之间建立一个可以通过维护自己的孩子属性来取消上下文的联系。
上面的示意图使我们能够更好地理解整个上下文链接的全景外观。
查看源代码的学生专注于使用cancancel和withDeadline的方法
在propagatecancel中,您会在祖先上下文节点中找到被取消的上下文,并将自己保持在祖先的幼儿lon属性中。
在这种结构设计之后,如果您想取消整个任务链接,则可以取消自己并取消较低级别的所有取消ctct。
现在让我们回到开始的榜样。在上下文中,我们的任务将变成什么?
我们让每个goroutine携带上下文。只要它们监视这些SubceLCTX并结束操作,即通过上下文完成对较低级别Goroutine的取消控制,就可以接收信号。
面对不同级别的Goroutine取消条件在不同级别上,只需要聆听传递给Goroutine的上下文,以避免监视多个信号的乏味。
为了响应上下文的使用,GO正式提及以下几点:
我认为第一点的前半部分远。例如,在官方的NET/HTTP软件包中,将上下文放置在请求的结构中。其他要点确实是一个值得关注的地方。
好吧,今天是源代码没有滚动的一天。不要小气看,谢谢您的支持。
如果您想查看上下文的源代码分析,则该文章是由Nongnaohua源推荐的:深刻解密Golang上下文,应注意,该文章解释的代码是版本1.9。以后实施原则没有影响。
今天的文章在这里。如果您喜欢我的文章,请帮助我喜欢它。我将每周通过技术文章分享我的学习经验和第一手实践经验。感谢您的支持。WeChat搜索遵循公共帐户WEB管理BI,每周教您高级知识。