参考:
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 数量与任务
数量相等
时,可以做到并行
执行,但一般情况
下都是并发
执行。
网友评论