Actor模型和CSP模型的区别

Actor模型和CSP模型的区别

  Akka/Erlang的actor模型与Go语言的协程Goroutine与通道Channel表明的CSP(Communicating Sequential Processes)模型有什么区别呢?html

  首先这二者都是并发模型的解决方案,咱们看看Actor和Channel这两个方案的不一样:程序员

Actor模型

  在Actor模型中,主角是Actor,相似一种worker,Actor彼此之间直接发送消息,不须要通过什么中介,消息是异步发送和处理的:编程

actor模型

  Actor模型描述了一组为了不并发编程的常见问题的公理:并发

  1.全部Actor状态是Actor本地的,外部没法访问。
  2.Actor必须只有经过消息传递进行通讯。  
  3.一个Actor能够响应消息:推出新Actor,改变其内部状态,或将消息发送到一个或多个其余参与者。
  4.Actor可能会堵塞本身,但Actor不该该堵塞它运行的线程。异步

  更多可见Actor模型专题操作系统

 

Channel模型

  Channel模型中,worker之间不直接彼此联系,而是经过不一样channel进行消息发布和侦听。消息的发送者和接收者之间经过Channel松耦合,发送者不知道本身消息被哪一个接收者消费了,接收者也不知道是哪一个发送者发送的消息。线程

channel模型

  Go语言的CSP模型是由协程Goroutine与通道Channel实现:3d

  • Go协程goroutine: 是一种轻量线程,它不是操做系统的线程,而是将一个操做系统线程分段使用,经过调度器实现协做式调度。是一种绿色线程,微线程,它与Coroutine协程也有区别,可以在发现堵塞后启动新的微线程。
  • 通道channel: 相似Unix的Pipe,用于协程之间通信和同步。协程之间虽然解耦,可是它们和Channel有着耦合。

 

Actor模型和CSP区别

  Actor模型和CSP区别图以下:协程

  Actor之间直接通信,而CSP是经过Channel通信,在耦合度上二者是有区别的,后者更加松耦合。htm

  同时,它们都是描述独立的流程经过消息传递进行通讯。主要的区别在于:在CSP消息交换是同步的(即两个流程的执行"接触点"的,在此他们交换消息),而Actor模型是彻底解耦的,能够在任意的时间将消息发送给任何未经证明的接受者。因为Actor享有更大的相互独立,由于他能够根据本身的状态选择处理哪一个传入消息。自主性更大些。

  在Go语言中为了避免堵塞流程,程序员必须检查不一样的传入消息,以便预见确保正确的顺序。CSP好处是Channel不须要缓冲消息,而Actor理论上须要一个无限大小的邮箱做为消息缓冲。

 

https://www.jdon.com/concurrent/actor-csp.html