使用Context进行并发控制
Context对派生goroutine有较强的控制力,也可以控制多级goroutine,所有很适合处理并发。其可以控制一组呈树壮结构的goroutine,每个goroutine都有相同的Context,常用场景如下:
内置的四种Context
context包提供了4个方法创建不同类型的context,使用这四个方法时如果没有父context,都需要传入backgroud,即backgroud作为其父节点:
- WithCancel() // 会记录由此Context派生的goroutine,执行cancel时,会所有goroutine都cancel
- WithDeadline()
- WithTimeout()
- WithValue()
关系如下:
总结
- Context仅仅是一个接口定义,根据实现的不同,可以衍生出不同的context类型;
- cancelCtx实现了Context接口,通过WithCancel()创建cancelCtx实例;
- timerCtx实现了Context接口,通过WithDeadline()和WithTimeout()创建timerCtx实例;
- valueCtx实现了Context接口,通过WithValue()创建valueCtx实例;
- 三种context实例可互为父节点,从而可以组合成不同的应用形式;