一句话笔记-20220425

for range channel 引发的思考

1
2
3
4
5
6
7
8
9
10
ch := make(chan struct{}, 2)

for i := 0; i < 10; i++ {
// <- ch // 1
go func() {
// <- ch // 2
// do something here
// ...
}
}

一哥们找我说上面的代码(写法 1 & 2)有什么意图时,开始我还没 get 到点,而且还陷入了调度顺序的逻辑里。

首先要说明的是:两种写法都能控制并发的数量。

其实,这哥们想讨论的其实是资源本身的问题,用写法 1 是在拿到准入条件后才开始去创建 goroutine 的,但是写法 2 是一开始就创建了所有的 goroutine 然后才开始去竞争准入条件的。很明显 1 比 2 消耗更少的资源。

相较于资源的消耗,个人觉得还有一个就是执行效率上的差别,写法 1 在拿到准入后再开始准备 gorotine 然后再开始排队与执行。所以长时间运行结果,2 比 1 有更优的效率。

因此,对于服务端架构应该是充分考虑“权衡的艺术”。


一句话笔记-20220425
https://blog.isnap.cn/posts/4c2163c4/
作者
三岁于辛
发布于
2022年4月25日
许可协议