CSP 模型是上个世纪七十年代提出的, 用于描述两个独立的并发实体通过共享的通讯 channel(管道)进行通信的并发模型. CSP 中 channel 是第一类对象, 它不关注发送消息的实体, 而关注与发送消息时使用的 channel.
Golang CSP
Golang 就是借用 CSP 模型的一些概念为之实现并发进行理论支持, 其实从实际上出发, go 语言并没有, 完全实现了 CSP 模型的所有理论, 仅仅是借用了 process 和 channel 这两个概念. process 是在 go 语言上的表现就是 goroutine 是实际并发执行的实体, 每个实体之间是通过 channel 通讯来实现数据共享.
Channel
Golang 中使用 CSP 中 channel 这个概念. channel 是被单独创建并且可以在进程之间传递, 它的通信模式类似于 boss-worker 模式的, 一个实体通过将消息发送到 channel 中, 然后又监听这个 channel 的实体处理, 两个实体之间是匿名的, 这个就实现实体中间的解耦, 其中 channel 是同步的一个消息被发送到 channel 中, 最终是一定要被另外的实体消费掉的, 在实现原理上其实是一个阻塞的消息队列.
Goroutine
Goroutine 是实际并发执行的实体, 它底层是使用协程 (coroutine) 实现并发, coroutine 是一种运行在用户态的用户线程, 类似于 greenthread,go 底层选择使用 coroutine 的出发点是因为, 它具有以下特点:
用户空间: 避免了内核态和用户态的切换导致的成本
可以由语言和框架层进行调度
更小的栈空间允许创建大量的实例
可以看到第二条 用户空间线程的调度不是由操作系统来完成的, 像在 java 1.3 中使用的 greenthread 的是由 JVM 统一调度的(后 java 已经改为内核线程), 还有在 Ruby 中的 fiber(半协程) 是需要在重新中自己进行调度的, 而 goroutine 是在 golang 层面提供了调度器, 并且对网络 IO 库进行了封装, 屏蔽了复杂的细节, 对外提供统一的语法关键字支持, 简化了并发程序编写的成本.
来源: http://www.bubuko.com/infodetail-3394679.html