Go并发之Context篇
前言介绍:在学习Go并发的时候,我们总是能够看到context,而这个context却只在go语言中存在。笔者在看到context的时候,便问了自己几个问题。
context是什么?是用来干什么的?我们为什么需要context? context是如何使用的?它为什么被设计成这个样子?
基于上面的这些问题,笔者做了整理,笔者觉得在知道了这些问题的答案之后,context 也算是有一点了解了。
1. 为什么Go需要context,它是用来干什么的?
原因:在golang中的创建一个新的协程并不会返回像c语言创建一个线程一样类似的pid,这样就导致我们不能从外部杀死某个线程,所以我们就得让它自己结束。(备注:goroutine不能返回pid的原因,应该是协程的实现原理有很大关系,多个协程对应1个线程的实现机制。)
当然我们可以采用channel+select的方式,来解决这个问题,不过场景很复杂的时候,我们就需要花费很大的精力去维护channel与这些协程之间的关系,这就导致了我们的并发代码变得很难维护和管理。例如:由一个请求衍生出多个协程,并且之间需要满足一定的约束关系,以实现一些诸如:有效期,中止线程树,传递请求全局变量之类的功能。
Context机制:context的产生,正是因为协程的管理问题,golang官方从1.7之后引入了context,用来专门管理协程之间的关系。
Google的解决