最近在看《七天七并发模型》这本书,在书上介绍了 Actor 和 CSP 这两种并发模型。这两种模型很像,但还是有一些不同的地方。看完之后,比较困扰的是:

在什么场合使用哪种模型比较好呢?

在网上查了一些资料,在没有实现使用这两种模型进行编程的情况下,结合网上的资料,把自己的思考记录一下。下面先说说两种模型的不同点吧。

一,主要的不同点

1,关于消息发送方和接收方。

  • Actor:注重的处理单元,也就是Actor,而不是消息传送方式。发送消息时,都需要知道对方是谁。

    这里的“都需要知道对方是谁”的意思,当ActorX要给ActorY发消息时,必须明确知道ActorY的地址。ActorY接收到消息时,就能够知道消息发送者(ActorX)的地址。返回消息给发送者时,只需要按发送者的地址往回传消息就行。

  • CSP:注重的是消息传送方式(channel),不关心发送的人和接收的人是谁。

    向channel写消息的人,不知道消息的接收者是谁;读消息的人,也不知道消息的写入者是谁。

两者比较看来,CSP把发送方和接收方给解耦了,但这种解耦带的好处是什么呢?

2,消息传输方式

  • Actor:每一对Actor之间,都有一个“MailBox”来进行收发消息。消息的收发是异步的。
  • CSP:使用定义的 channel 进行收发消息。消息的收发是同步的(也可以做成异步的,但是一个有限异步)

看了《并发之痛 Thread,Goroutine,Actor》这篇文章的中,关于 Actor 和 CSP 不同点的说明,感觉有一点可能留意:

Actor 模式消息传输,只有一个通道(MailBox),所以无论什么“类型”的消息都可能发过来,所以要做好模式配置。而 CSP 中的通道(channel)类型是定好的,而且两个对象可以可以使用多个通道传输消息。(CSP 把通信给细化了,让你在通信时有多种选择,例如:用一个 channel 传一类数据,用另一个 channel 传另一类数据)

这就和MQ的机制有点像了。在通过MQ传输消息时有两种选择:

  • 选择把这个消息发送到哪个 Exchange(类似 channel)里,对于不同的 Exchange 可以有不同的处理程序。
  • 还可以把数据发送到一个 Exchange 里,然后设置分发规则,选择不同的处理程序。

(不知道这点对选择哪种哪种模型有没有什么帮助?)

总结:没有看到两者不同点,给某一方带来什么特别明显的好处。

二,从写程序的角度来看,有什么不同呢?

1,假如,要做“关于取得RSS文章的单词数”这样的程序的话:

CSP:

  • 步骤1:定义几个channel,保存不同处理的之间的数据: 
    1,新文章ch 
    2,文章内容ch 
    3,单词数ch

  • 步骤2:然后写相应的处理程序: 
    1,新文章URL处理(把得取的新文章的URL,写入“新文章ch”) 
    2,新文章内容处理(把新文章内容读取下来,写入“文章内容ch”) 
    3,单词数统计(对文章内容进行单词个数统计,写入“单词数ch”) 
    4,文章单词数累加(读取“单词数ch”,把各个文章单词数进行累加)

  • 步骤3:在主程序中,定义上面的几个channel,再调用几个处理程序,并把channel当成参数传给处理程序

Actor:

  • 步骤1:定义控制Actor,控制程序流程,功能如下: 
    1,当收到指令是“新文章URL处理”的话,调用“新文章URL处理”Actor,并把处理结果返回给调用者。 
    2,当收到指令是“新文章内容处理”的话,调用“新文章内容处理”Actor,并把处理结果返回给调用者。 
    3,当收到指令是“单词数统计”的话,调用“单词数统计”Actor,并把处理结果返回给调用者。 
    4,当收到指令是“文章单词数累加”的话,调用“文章单词数累加”Actor,并把处理结果返回给调用者。 
    (以上的每一个指令的执行,都可以做成并行的)

  • 步骤2:定义指令相对应的处理程序。

  • 步骤3:主程序,向“控制Actor”发指令,并把每次指令的结果当成参数,传给下一次的指令调用。

2,如果需求增加,在单词数统计时,去掉”of/to/and”这些单词的话,CSP和Actor要怎么做呢?

CSP:

  • 主程序: 
    1,定义一个新的ch 
    2,并增加对内容过滤程序的调用。 
    3,传给“单词数统计”程序的ch,要修改成新定义的ch

  • 子程序: 
    1,新加一个处理程序。

Actor:

  • 主程序: 
    1,增加对内容过滤Actor的调用
  • 控制Actor: 
    1,增加一个新的内容过滤指令
  • 子程序: 
    1,定义一个新的内容过滤Actor

总结:从最初的需求做成,到根据新需求修改上,感觉不两者差别并不大。 
(可能因为没有实际编码过,在做一个需求或是一个大一点项目时,会感觉到不同吧。)

其它参考

1,《并发之痛 Thread,Goroutine,Actor》文章的最后一部分:

CSP的模式比较适合Boss-Worker模式的任务分发机制,它的侵入性没那么强,可以在现有的系统中通过CSP解决某个具体的问题。它并不试图解决通信的超时容错问题,这个还是需要发起方进行处理。同时由于Channel是显式的,虽然可以通过netchan(原来Go提供的netchan机制由于过于复杂,被废弃,在讨论新的netchan)实现远程Channel,但很难做到对使用方透明。 
而Actor则是一种全新的抽象,使用Actor要面临整个应用架构机制和思维方式的变更。它试图要解决的问题要更广一些,比如容错,比如分布式。但Actor的问题在于以当前的调度效率,哪怕是用Goroutine这样的机制,也很难达到直接方法调用的效率。当前要像OO的『一切皆对象』一样实现一个『一切皆Actor』的语言,效率上肯定有问题。所以折中的方式是在OO的基础上,将系统的某个层面的组件抽象为Actor。

这段话中,有一点可能要注意

而Actor则是一种全新的抽象,使用Actor要面临整个应用架构机制和思维方式的变更。

2,《Scala与Golang的并发实现对比》:关于 Actor 和 CSP 的一般实现方式,不了解实现的可以看一下。 
看了一些例子,感觉

参考文章:

关于并发模型 Actor 和 CSP的更多相关文章

  1. Go的CSP并发模型实现:M, P, G

    最近抽空研究.整理了一下Golang调度机制,学习了其他大牛的文章.把自己的理解写下来.如有错误,请指正!!! golang的goroutine机制有点像线程池:        一.go 内部有三个对 ...

  2. Go的CSP并发模型

    golang的goroutine机制:        一.go 内部有三个对象: P对象(processor) 代表上下文(或者可以认为是cpu),M(work thread)代表工作线程,G对象(g ...

  3. Go语言 | CSP并发模型与Goroutine的基本使用

    今天是golang专题的第13篇文章,我们一起来聊聊golang当中的并发与Goroutine. 在之前的文章当中我们介绍完了golang当中常用的使用方法和规范,在接下来的文章当中和大家聊聊gola ...

  4. 三分钟掌握共享内存 & Actor并发模型

    吃点好的,很有必要.今天介绍常见的两种并发模型: 共享内存&Actor 共享内存 面向对象编程中,万物都是对象,数据+行为=对象: 多核时代,可并行多个线程,但是受限于资源对象,线程之间存在对 ...

  5. 共享内存 & Actor并发模型哪个更快?

    HI,前几天被.NET圈纪检委@懒得勤快问到共享内存和Actor并发模型哪个速度更快. 前文传送门: 说实在,我内心10w头羊驼跑过...... 先说结论 首先两者对于并发的风格模型不一样. 共享内存 ...

  6. 并发模型与IO模型梳理

    并发模型 常见的并发模型一般包括3类,基于线程与锁的内存共享模型,actor模型和CSP模型,其中尤以线程与锁的共享内存模型最为常见.由于go语言的兴起,CSP模型也越来越受关注.基于锁的共享内存模型 ...

  7. Go_CSP并发模型

    go语言的最大两个亮点,一个是goroutine,一个就是chan了.二者合体的典型应用CSP,基本就是大家认可的并行开发神器,简化了并行程序的开发难度,我们来看一下CSP. 11.1.CSP是什么 ...

  8. Java并发模型(一)

    学习资料来自http://ifeve.com/java-concurrency-thread-directory/ 一.多线程 进程和线程的区别: 一个程序运行至少一个进程,一个进程至少包含一个线程. ...

  9. 一网打尽 Java 并发模型

    本篇文章我们来探讨一下并发设计模型. 可以使用不同的并发模型来实现并发系统,并发模型说的是系统中的线程如何协作完成并发任务.不同的并发模型以不同的方式拆分任务,线程可以以不同的方式进行通信和协作. 并 ...

随机推荐

  1. sql server mvp 發糞塗牆

    http://blog.csdn.net/dba_huangzj/article/details/38295753

  2. 使用TensorFlow实现神经网络的介绍

    http://www.toutiao.com/i6414029277641048577/

  3. Vue服务端渲染 VS Vue浏览器端渲染)

    Vue 2.0 开始支持服务端渲染的功能,所以本文章也是基于vue 2.0以上版本.网上对于服务端渲染的资料还是比较少,最经典的莫过于Vue作者尤雨溪大神的 vue-hacker-news.本人在公司 ...

  4. 【Mysql】字段排序中文排序

    在mysql中 如果字段的值是中文的话,排序结果往往不符合人意. 所以如果要中文排序正常的话,可以使用如下函数 SELECT huayangare0_.id AS id1_0_, huayangare ...

  5. VUE的进阶 标签属性数据绑定和拼接

    在vue官网把文档扫了一遍后,就开始写网站项目了,没有设计,就百度里找了一个h5的助赢软件的网站把他copy下来,想想有点坏了,接着把内容改改吧.首先开始做一个列表展示vue实例好后,给对象添加默认数 ...

  6. js延时函数setTimeout

    实现一个延时执行的效果,现记录如下: <html> <head> <script type="text/javascript" src="/ ...

  7. JAVA常见算法题(五)

    package com.xiaowu.demo; /** * 利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示. * * * @ ...

  8. Mac安装pstree

    brew install pstree pstree(选项) -a:显示每个程序的完整指令,包含路径,参数或是常驻服务的标示: -c:不使用精简标示法: -G:使用VT100终端机的列绘图字符: -h ...

  9. 从头认识Spring-1.7 如何通过属性注入Bean?(1)-如何通过属性向对象注入值?

    这一章节我们来讨论一下如何通过属性注入Bean? 这一章节分为两部分,第一部分我们通过属性向对象注入值,第二部分我们通过属性向对象注入还有一个对象的引用. 1.如何通过属性向对象注入值? (1)dom ...

  10. php正则表达式基本

    一.正则表达式的组成 1.分隔符,可以是除了字母,数字,反斜线及空白以外的任何字符,比如/,!,#,%,|,~等;通常有/,!,~ 2.表达式:由一些特殊字符和非特殊字符组成. 3.修饰符:用于开启或 ...