Golang--Goroutines

来源:互联网 发布:1991莫斯科摇滚知乎 编辑:程序博客网 时间:2024/06/14 22:01

Thread-per-connection模型不够有效,在诸多比较合适的范式中,Communicating Sequential Processes(顺序通信处理,CSP)还有一个叫做message passing-model(消息传递)。
协程是根据一个或多个线程的可用性,映射(多路复用,执行于)在他们之上的;协程调度器在Go运行时很好的完成了这个工作。协程工作在相同的地址空间中,所以共享一定是同步的:Go使用channels来同步协程。
协程会随着程序的结束而消亡。当main()函数返回的时候,程序退出:它不会等待其他任何其他非main协程的结束。这就是为什么在服务器程序中,每一个请求都会启动一个协程来处理,server()函数必须保持运行状态,通常使用一个无限循环来达到这样的目的。
- 通道阻塞
默认情况下,通信是同步且无缓冲的:在有接受者接收数据之前,发送不会结束。可以想象一个无缓冲的通道在没有空间来保存数据的时候:必须要一个接收者准备好接收通道的数据然后发送者可以直接把数据发送给接收者。所以通道的发送、接收操作在对方准备好之前是阻塞的:
1)对于同一个通道,发送操作(协程或者函数中的)在接收者准备好之前是阻塞的:如果ch中的数据无人接收,就无法再给ch传入其他数据–新的输入无法在通道非空的情况下传入。
2)对于同一个通道,接收操作是阻塞的,直到发送者可用:如果通道中没有数据,接收者就阻塞了。
- 信号量模式
所谓信号量模式就是使用通道让main程序等待协程完成。

func main() {ch := make(chan bool)go compute()<-ch}func compute() {//do somethingch<- true}

并行for循环

type Empty interface{}var empty Empty...data := make([]float64, N)res := make([]float64, N)sem := make(chan Empty, N)...for k, v := range data {go func(k int, v float64) {res[k] = doSomething(k, v)sem<-empty}(k, v)}for 1:= 0; i < N; i++ {<-sem}
0 0