介绍今天,我们讨论Go编程中context非常重要的一个东西:context超时。我们先简单举个现实生活中的一个场景:想象一下您在一个游乐场,兴奋地想要坐上巨型过山车。但有一个问题:排队的队伍超级长,而且距离游乐场关闭只有一个小时的时间。你该怎么办?嗯,你可能会等一段时间,但不会等一个小时,对吧?如果你等了 30 分钟但仍未排在队伍的前面,你可以离开队列尝试其他的项目。这个例子就是我们所说的“超时”。现在,想象一下你还在排队,突然下起了大雨。游乐场决定关闭过山车。你肯定不会还坚持去排队等待吧?你会马上离开或者去其他地方。这里就是我们所说的“取消”了。在编程里面,我们经常也会遇到类似的情况。要求我们的程序执行可能需要很长时间或由于某种原因需要停止任务。那么这时候context包发挥作用就来了。它可以让我们能够优雅的去处理这些超时和取消。当然我们在上一篇《goroutine并发控制与通信》文章中也讲到了用context去实现多线程的并发控制与通信,这里我们更详细的去介绍context的使用方法。工作原理我们可以分下面几步去模拟上面的场景:首先创建一个上下文,这里和上面场景的去排队过山车类似
序这是Go标准库中的包之一,优雅、功能强大、编写良好且文档齐全。大多数Go开发者的初级阶段都觉得它更令人困惑,就像我在学习Go程序的早期阶段所遇到的那样,迷茫不知道如何上手。原理如下图所示: Golang 中context的入口点是上下文包,它是一个根节点emptyCtx,我们需要的任何上下文(Context)都将是根(emptyCtx)上下文的子级。当需要带有cancel - cancelCtx的上下文时,它实际上会采用父级上下文(空Context),在本例中context.Background()返回的就是一个emptyCtx,并且它将生成以context.Background()作为父级上下文的新上下文,所以我们可以从先前的上下文创建任何上下文作为父上下文,这样就形成了一个图表,也类似于我们常说的树这种数据结构。如果父级上下文被取消(cancel),取消实际上会传播到其所有子级及其子级的所有子级,因此我们在复杂的并发编程中非常有用。应用context中有以下几个场景方法:上面的Background()与TODO()都是空上下文,但是一般我们都使用context.Backgroun
序对于Golang来说,原生支持并发是它的一个强项。并且在项目业务中,很多时候需要用到goroutine去并发的处理业务,多个goroutine之间需要同步与通信,主goroutine需要控制它所属的子goroutine。对于这种情况其实还是很常见的,那么下面我们专门介绍实现多个goroutine间的同步与通信。同步与通信解决方法全局共享变量(共享内存)channel通信(CSP模型)Context包全局共享变量(共享内存)通过一个变量控制所有的子goroutine开始和结束,并不断的去轮询这个变量检查是否有更新,如果子goroutine检测到这个变量有更新就会执行对应的业务逻辑。对于同步与通信来说,共享变量是一个最简单的一个方案,但是在功能上确实有着显著的缺点:全局变量不是线程安全,需要处理竞争关系,所以我们需要对这个变量加锁处理,这样就增加的复杂度,并且过多的锁,容易死锁。排查起来也很困难全局变量传递的数据信息较小,所以它不适用于子goroutine间的通信因为单向通知的原因,主goroutine无法等待所有的子goroutine退出示例:var signal = true fun
青丝南开
文字、摄影、骑行爱好者