最近在看《七天七并发模型》这本书,在书上介绍了 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. Linux查看哪些进程用了Swap分区

    如果系统的物理内存用光了,则会用到swap.系统就会跑得很慢,但仍能运行;如果Swap空间用光了,那么系统就会发生错误.通常会出现“application is out of memory”的错误,严 ...

  2. MySQL EXPLAIN 命令详解学习

    http://blog.csdn.net/mchdba/article/details/9190771

  3. C语言中不同类型的数据转换规则

    不同类型数据间的混合运算与类型转换 1.自动类型转换 在C语言中,自动类型转换遵循以下规则: ①若参与运算量的类型不同,则先转换成同一类型,然后进行运算 ②转换按数据长度增加的方向进行,以保证精度不降 ...

  4. wildfly配置PostgreSQL数据源

    wildfly配置PostgreSQL数据源 很久以前写过在JBoss AS7上如何配置PostgreSQL数据源,此方法在wildfly上依然有效.不过,通过wildfly的命令行工具可以有更简单的 ...

  5. osgconv使用指南(转)

    osgconv是一种用来读取3D数据库以及对它们实施一些简单的操作的实用应用程序,同时也被称作 一种专用3D数据库工具. 用osgconv把其他格式的文件转换为OSG所支持的格式 osgconv是一种 ...

  6. Windows API常用函数

    转自:http://www.cnblogs.com/xiashengwang/p/4026259.html .NET中虽然类库很强,但还是有些时候功能有限,掌握常用的api函数, 会给我们解决问题提供 ...

  7. JSP Response Set Status

    JSP Response Set Status In this tutorial you will learn about how to set the HTTP status code in JSP ...

  8. zabbix自定义触发器

    zabbix中监控项仅负责收集数据,而通常收集数据的目的还包括在某指标对应的数据超出合理范围时给相关人员发送告警信息,"触发器"正式 用于为监控项所收集的数据定义阈值,每一个触发器 ...

  9. zabbix主机自动发现和监控

    在主机较多的时候,配置主机自动发现并加入监控可以代替手动的添加主机,减轻工作量,自动发现由服务端主动发起,Zabbix Server开启发现进程,定时扫描局域网中IP服务器.设备.可以根据需要,在对主 ...

  10. 转: Eclispe的远程开发

    from: http://www.thinksaas.cn/topics/0/528/528009.html 新项目中用到了所谓的Eclipse远程开发.参考: http://www.eclipse. ...