Browse Source

Update 14.1.md

glight2000 10 years ago
parent
commit
5882bf32af
1 changed files with 13 additions and 1 deletions
  1. 13 1
      eBook/14.1.md

+ 13 - 1
eBook/14.1.md

@@ -21,11 +21,23 @@ Go更倾向于其他的方式,在诸多比较合适的范式中,有个被称
 
 当系统调用(比如等待I/O)阻塞协程时,其他协程会继续在其他线程上工作。协程的设计隐藏了许多线程创建和管理方面的复杂工作。
 
-协程是轻量的,比线程更轻。它们痕迹非常不明显(使用少量的内存和资源):在堆中使用4K的堆内存就可以创建它们。因为创建非常廉价,必要的时候可以轻松创建并运行大量的协程(在同一个一个地址空间中100,000个连续的协程)。并且它们对堆进行了分割,从而动态的增加(或缩减)内存的使用;堆的管理是自动的,但不是由垃圾回收器管理的,而是在协程退出后自动释放。
+协程是轻量的,比线程更轻。它们痕迹非常不明显(使用少量的内存和资源):使用4K的栈内存就可以在堆中创建它们。因为创建非常廉价,必要的时候可以轻松创建并运行大量的协程(在同一个一个地址空间中100,000个连续的协程)。并且它们对栈进行了分割,从而动态的增加(或缩减)内存的使用;栈的管理是自动的,但不是由垃圾回收器管理的,而是在协程退出后自动释放。
 
 协程可以运行在多个操作系统线程之间,也可以运行在线程之内,让你可以很小的内存占用就可以处理大量的任务。由于操作系统线程上的协程时间片,你可以使用少量的操作系统线程就能拥有任意多个提供服务的协程,而且Go运行时可以聪明的意识到哪些协程被阻塞了,暂时搁置它们并处理其他携程。
 
+存在两种并发方式:确定性的(明确定义排序)和非确定性的(加锁/互斥从而未定义排序)。Go的协程和通道理所当然的支持确定性的并发方式(例如通道具有一个sender和一个receiver)。我们会在章节[14.7](14.7.md)中使用一个常见的算法问题(工人问题)来对比两种处理方式。
 
+协程是通过使用关键字`go`调用(执行)一个函数或者方法来实现的(也可以是匿名或者lambda函数)。这样会在当前的计算过程中开始一个同时进行的函数,在相同的地址空间中并且分配了独立的栈,比如:`go sum(bigArray)`// 在后台计算总和
+
+协程的栈会根据需要进行伸缩,不出现栈溢出;开发者不需要关心栈的大小。当协程结束的时候,它会静默退出:用来启动这个协程的函数不会得到任何的返回值。
+
+任何Go程序都必须有的`main()`函数也可以看做是一个协程,尽管它并没有通过`go`来启动。协程可以在程序初始化的过程中运行(在`init()`函数中)。
+
+在一个协程中,比如它需要进行非常密集的运算,你可以在运算循环中周期的使用`runtime.Gosched()`:这会让出处理器,允许运行其他协程;它并不会使当前协程挂起,所以它会自动恢复执行。使用`Gosched()`可以使计算均匀分布,使通信不至于迟迟得不到响应。
+
+## 14.1.2 并发和并行的差异
+
+Go的并发原语提供了良好的并发设计基础:
 
 
 ## 链接