本文先讲解在什么情况下需要什么用 Go 的 Context 作为切入点来了解 Go 的 Context~
如何通知 goroutine 停止执行?
1 | func main(){ |
在解决这个问题前,先走点弯路,看看怎么等待 goroutine 完成执行~
等待 goroutine 完成执行
1 | func main() { |
Channel 通知
1 | func main() { |
使用 chan + select 的方式,的确可以做到通知一个 goroutine 停止,
但如果有多个 goroutine,并且有嵌套,那么是否有比较好的方式来实现停止操作?
1 | func main() { |
Go Context
1 | func main() { |
Context 的定义
1 | type Context interface { |
Done()
+ Err()
函数的一般使用方式
1 | func Stream(ctx context.Context, out chan<- Value) error { |
Context 的实现
空实现 emptyCtx
1 | // An emptyCtx is never canceled, has no values, and has no deadline. |
空实现的作用
1 | var ( |
cancelCtx,timerCtx,valueCtx 实现
1 | func main() { |
cancelCtx
以及 timerCtx
还实现了另外一个接口 canceler
1 | // A canceler is a context type that can be canceled directly. |
cancelCtx 详解
cancelCtx 的定义
1 | // A cancelCtx can be canceled. When canceled, it also cancels any children that implement canceler. |
cancelCtx 的构造
1 | func WithCancel(parent Context) (ctx Context, cancel CancelFunc) { |
timerCtx 详解
valueCtx 详解
参考资料
深度解密Go语言之context https://blog.csdn.net/cpongo5/article/details/93634032
go context 讲解 https://www.cnblogs.com/netuml/p/9063301.html
golang从context源码领悟接口的设计 https://www.cnblogs.com/li-peng/p/11249478.html
Golang Context深入理解 https://juejin.im/post/5a6873fef265da3e317e55b6