写点什么

Go Channel

用户头像
escray
关注
发布于: 2021 年 04 月 21 日
Go Channel

极客时间《Go 语言从入门到实践》学习笔记 08


27 | channel 的关闭和广播


一个或多个 Producer ,配合一个或多个 Receiver,语句串行,线程调度并行,Go 语言确实是天生异步。


我觉的 channel 关闭的机制还是挺巧妙的。


结合留言中的代码示例,可以看到 close 是异步的,会等通道中的数据被完全读取之后再关闭。


ch chan int, wg *sync.WaitGroup
复制代码


这个参数列表可以记在心中


另外得记住 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


以上两个链接,我也没看,不明觉厉。

发布于: 2021 年 04 月 21 日阅读数: 16
用户头像

escray

关注

Let's Go 2017.11.19 加入

Let's Go,用 100 天的时间从入门到入职

评论

发布
暂无评论
Go Channel