Golang: 深入探究 Golang 并发

深入探究一下 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 专栏

文章目录
|