CS架构 java 数据库 java实现cs架构 | 您所在的位置:网站首页 › java实现cs架构 › CS架构 java 数据库 java实现cs架构 |
CSP模型 Hi,我是阿昌,今天学习记录的是关于CSP模型的内容。 CSP模型,是通过以消息传递(Message-Passing)的方式多线程通信,以通信方式共享内存 Golang 是一门号称从语言层面支持并发的编程语言,支持并发是 Golang 一个非常重要的特性。在协程,Golang 支持协程,协程可以类比 Java 中的线程,解决并发问题的难点就在于线程(协程)之间的协作。那 Golang 是如何解决协作问题的呢? 总的来说,Golang 提供了两种不同的方案: 一种方案支持协程之间以共享内存的方式通信,Golang 提供了管程和原子类来对协程进行同步控制,这个方案与 Java 语言类似;另一种方案支持协程之间以消息传递(Message-Passing)的方式通信,本质上是要避免共享,Golang 的这个方案是基于 CSP(Communicating Sequential Processes)模型实现的。Golang 比较推荐的方案是后者。 一、什么是 CSP 模型Actor 模型 中 Actor 之间就是不能共享内存的,彼此之间通信只能依靠消息传递的方式。 Golang 实现的 CSP 模型和 Actor 模型看上去非常相似,Golang 程序员中有句格言:“不要以共享内存方式通信,要以通信方式共享内存(Don’t communicate by sharing memory, share memory by communicating)。” 虽然 Golang 中协程之间,也能够以共享内存的方式通信,但是并不推荐;而推荐的以通信的方式共享内存,实际上指的就是协程之间以消息传递方式来通信。 下面一个简单的示例,看看 Golang 中协程之间是如何以消息传递的方式实现通信的。 示例的目标是打印从 1 累加到 100 亿的结果,如果使用单个协程来计算,大概需要 4 秒多的时间。 单个协程,只能用到 CPU 中的一个核,为了提高计算性能,可以用多个协程来并行计算,这样就能发挥多核的优势了。 在下面的示例代码中,用了 4 个子协程来并行执行,这 4 个子协程分别计算[1, 25 亿]、(25 亿, 50 亿]、(50 亿, 75 亿]、(75 亿, 100 亿],最后再在主协程中汇总 4 个子协程的计算结果。 主协程要汇总 4 个子协程的计算结果,势必要和 4 个子协程之间通信,Golang 中协程之间通信推荐的是使用 channel,channel 你可以形象地理解为现实世界里的管道。 另外,calc() 方法的返回值是一个只能接收数据的 channel ch,它创建的子协程会把计算结果发送到这个 ch 中,而主协程也会将这个计算结果通过 ch 读取出来。 import ( "fmt" "time" ) func main() { // 变量声明 var result, i uint64 // 单个协程执行累加操作 start := time.Now() for i = 1; i |
CopyRight 2018-2019 实验室设备网 版权所有 |