mirror of
https://github.com/unknwon/the-way-to-go_ZH_CN.git
synced 2025-08-12 03:34:15 +08:00
Update 14.1.md
This commit is contained in:
@@ -23,7 +23,7 @@ Go更倾向于其他的方式,在诸多比较合适的范式中,有个被称
|
||||
|
||||
协程是轻量的,比线程更轻。它们痕迹非常不明显(使用少量的内存和资源):使用4K的栈内存就可以在堆中创建它们。因为创建非常廉价,必要的时候可以轻松创建并运行大量的协程(在同一个一个地址空间中100,000个连续的协程)。并且它们对栈进行了分割,从而动态的增加(或缩减)内存的使用;栈的管理是自动的,但不是由垃圾回收器管理的,而是在协程退出后自动释放。
|
||||
|
||||
协程可以运行在多个操作系统线程之间,也可以运行在线程之内,让你可以很小的内存占用就可以处理大量的任务。由于操作系统线程上的协程时间片,你可以使用少量的操作系统线程就能拥有任意多个提供服务的协程,而且Go运行时可以聪明的意识到哪些协程被阻塞了,暂时搁置它们并处理其他携程。
|
||||
协程可以运行在多个操作系统线程之间,也可以运行在线程之内,让你可以很小的内存占用就可以处理大量的任务。由于操作系统线程上的协程时间片,你可以使用少量的操作系统线程就能拥有任意多个提供服务的协程,而且Go运行时可以聪明的意识到哪些协程被阻塞了,暂时搁置它们并处理其他协程。
|
||||
|
||||
存在两种并发方式:确定性的(明确定义排序)和非确定性的(加锁/互斥从而未定义排序)。Go的协程和通道理所当然的支持确定性的并发方式(例如通道具有一个sender和一个receiver)。我们会在章节[14.7](14.7.md)中使用一个常见的算法问题(工人问题)来对比两种处理方式。
|
||||
|
||||
@@ -49,7 +49,13 @@ Go的并发原语提供了良好的并发设计基础:表达程序结构以便
|
||||
|
||||
## 14.1.3 使用GOMAXPROCS
|
||||
|
||||
在gc编译器下(6g或者8g)你必须设置GOMAXPROCS为一个大于默认值1的数值来允许运行时支持使用多于1个的操作系统线程,所有的协程都会共享同一个线程除非将GOMAXPROCS设置为一个大于1的数。当GOMAXPROCS大于1时,会有一个线程池管理许多的线程。通过`gccgo`编译器GOMAXPROCS有效的与运行中的协程数量相等。假设n是机器上处理器或者核心的数量。如果你设置环境变量GOMAXPROCS>=n,或者执行`runtime.GOMAXPROCS(n)`,接下来协程会被分割(分散)到n个处理器上。
|
||||
在gc编译器下(6g或者8g)你必须设置GOMAXPROCS为一个大于默认值1的数值来允许运行时支持使用多于1个的操作系统线程,所有的协程都会共享同一个线程除非将GOMAXPROCS设置为一个大于1的数。当GOMAXPROCS大于1时,会有一个线程池管理许多的线程。通过`gccgo`编译器GOMAXPROCS有效的与运行中的协程数量相等。假设n是机器上处理器或者核心的数量。如果你设置环境变量GOMAXPROCS>=n,或者执行`runtime.GOMAXPROCS(n)`,接下来协程会被分割(分散)到n个处理器上。更多的处理器并不意味着性能的线性提升。有这样一个经验法则,对于n个核心的情况设置GOMAXPROCS为n-1以获得最佳性能,也同样需要遵守这条规则:协程的数量 > 1 + GOMAXPROCS > 1
|
||||
|
||||
所以如果在某一时间只有一个协程在执行,不要设置GOMAXPROCS!
|
||||
|
||||
还有一些通过实验观察到的现象:在一台1颗CPU的笔记本电脑上,增加GOMAXPROCS到9会带来性能提升。在一台32核的机器上,设置GOMAXPROCS=8会达到最好的性能,在测试环境中,更高的数值无法提升性能。如果设置一个很大的GOMAXPROCS只会带来轻微的性能下降;设置GOMAXPROCS=100,使用“top”命令和“H”选项查看到只有7个活动的线程。
|
||||
|
||||
|
||||
|
||||
## 链接
|
||||
|
||||
|
Reference in New Issue
Block a user