参考:
http://c.biancheng.net/view/95.html
关键点
通过关键词汇
,实现快速
理解,记忆
的目的
:
1、
并发
,在同一个时间点
,任务不会
同时运行2、
并行
,在同一个时间点
,任务一定
是同时
运行的3、设置
GOMAXPROCS
的数量
等于任务数量
时,可以实现并行
运行4、
大
部分情况下,是并发
运行的5、Go语言的设计哲学中,提倡,用
较少
的资源
,去执行更多
的任务
1、并发 并行
概念
在讲解并发概念时,总会涉及另外一个概念并行。下面让我们来了解并发和并行之间的区别。
并发(concurrency):把任务在不同的时间点交给处理器进行处理。在同一时间点,任务并不会同时运行。
并行(parallelism):把每一个任务分配给每一个处理器独立完成。在同一时间点,任务一定是同时运行。
2、并发不是
并行。
- 并行
- 是让不同的代码片段同时在不同的物理处理器上执行。
- 并行的关键是同时做很多事情,而
并发
是指同时管理很多事情,这些事情可能只做了一半就被暂停去做别的事情了。
- 并发
- 在很多情况下,并发的效果比并行好,
- 因为操作系统和硬件的总资源一般很少,但能支持系统同时做很多事情。
- 这种“使用较少的资源做更多的事情”的哲学,也是指导
Go语言
设计的哲学
。
3、如何实现
并行呢?
如果希望让 goroutine 并行,必须使用多于一个逻辑处理器。
当有多个逻辑处理器时,调度器会将 goroutine 平等分配到每个逻辑处理器上。
这会让 goroutine 在不同的线程上运行。
不过要想真
的实现并行的效果,用户需要让自己的程序运行在有多个物理处理器的机器上。
否则,哪怕 Go语言运行时使用多个线程,goroutine 依然会在同一个物理处理器上并发运行,达不到并行的效果。
下图展示了在一个逻辑处理器上并发运行 goroutine 和在两个逻辑处理器上并行运行两个并发的 goroutine 之间的区别。
调度器包含一些聪明的算法,这些算法会随着 Go语言的发布被更新和改进,所以不推荐
盲目修改语言运行时对逻辑处理器的默认设置。
如果真的认为修改逻辑处理器的数量可以改进性能,也可以对语言运行时的参数进行细微调整。
图:并发与并行的区别
3.1、设置 GOMAXPROCS
Go语言在 GOMAXPROCS 数量与任务
数量相等
时,可以做到并行
执行,但一般情况
下都是并发
执行。