Go Channel
极客时间《Go 语言从入门到实践》学习笔记 08
27 | channel 的关闭和广播
一个或多个 Producer ,配合一个或多个 Receiver,语句串行,线程调度并行,Go 语言确实是天生异步。
我觉的 channel 关闭的机制还是挺巧妙的。
结合留言中的代码示例,可以看到 close 是异步的,会等通道中的数据被完全读取之后再关闭。
这个参数列表可以记在心中
另外得记住 channel 是结构体,传递的时候是被复制的,新旧两个 channel 指向同一个内存区域。
28 | 任务的取消
其实 Channel 取消操作和上一讲的 关闭 close 和广播 是密切相关的。Channel 关闭之后,会通知所有和它有关的 Receiver。
比较有意思的地方在于课后的一个留言,为什么总是 channel 4 先被取消?
如果不在调用 cancel 前增加 sleep 的话,我试着把循环中 i < 5 改为其他的值,那么首先被取消的都是最后一个协程。
加一点等待时间,排除缓存对程序的影响,似乎还是会成为一个相对固定的值。
此处必有蹊跷。
29 | Context 与任务取消
Context 确实在视频中没有讲,好在老师在回复留言的时候简单的介绍了一下。我抄一段官网的文字:
https://golang.org/pkg/context/
Package context defines the Context type, which carries deadlines, cancellation signals, and other request-scoped values across API boundaries and between processes.
Incoming requests to a server should create a Context, and outgoing calls to servers should accept a Context.
另外有同学留言说,没有讲到什么时候使用 close 取消任务什么时候使用 context。其实在课程的开篇,老师就提到了,使用 context 为了解决层级取消的问题,就是取消一个协程的子协程(树)甚至孙子协程(树)的问题。
稍微有点可惜的是,在课程的代码中并没有演示这一部分。
https://blog.golang.org/context
https://blog.golang.org/context-and-structs
以上两个链接,我也没看,不明觉厉。
版权声明: 本文为 InfoQ 作者【escray】的原创文章。
原文链接:【http://xie.infoq.cn/article/3bc971d08d7ad28c4b52eb4c6】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论