CS架构 java 数据库 java实现cs架构 您所在的位置:网站首页 java实现cs架构 CS架构 java 数据库 java实现cs架构

CS架构 java 数据库 java实现cs架构

#CS架构 java 数据库 java实现cs架构| 来源: 网络整理| 查看: 265

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 实验室设备网 版权所有