深入探究一下 Golang 并发处理,主要解决我在 《Golang代码走廊》 没有深入研究的多核,并发,并行等问题。
受不了 cpp 的各种臃肿机制以及繁琐的代码(网络,线程基本都自己封装过了,用包装类稍微好些;如果写裸的 std:: 库代码,还是会繁琐一点儿);结果发现 Golang 也是槽点多多,以至于现在下笔的时候就在想如果 Golang 加入泛型,加入更多丰富的容器,Raii 块级别的 refer 等机制会如何? 会不会变得和 cpp 一样臃肿呢?
当然,本文的重点,只是全方位看看 Concurrency 问题。(没有完美的语言)
- 多核协程 Vs 单核多线程(协程没有抢占,如果确定有的协程不会被饿死)(多核震荡如何处理的?绑定线程?)
- 在并发编程上,提供了哪些语言上的便利 (笔记我自己封装过得 std:thread 如何?)
- Go意义上的并发既然可以设置核心数目,是不是已经完成了类似并行的效果?
首先就要区分一下 Parallel 和 Concurrcy。
并行: 同一时间运行 (可能是多核运行,真正的同时运行)
并发: 同时做多件事儿,需要中央调度&切换(中间存在竞争,同步,合作)
老外总结的两句话,太经典了:
- Goroutines let you run multiple computations simultaneously.
- Channels let you coordinate the computations, by explicit communication.
其他,可以参考我的云笔记 《深入探究 Golang 并发和并行》 。 (整理后分享)
回顾的时候看了看,平时开发用到的比较深入的内容也就: pipeline 和 worker pool 两种模型
有时间再细说吧:
- sync.WaitGroup
- sync.Mutex, RWMutex
- channels
- goroutines
其实主要的还是官方说的那个总结:
Merlin 2018.3 改版,加入 golang 专栏