Akka/Erlang的actor模型与Go语言的协程Goroutine与通道Channel表明的CSP(Communicating Sequential Processes)模型有什么区别呢?html
首先这二者都是并发模型的解决方案,咱们看看Actor和Channel这两个方案的不一样:程序员
在Actor模型中,主角是Actor,相似一种worker,Actor彼此之间直接发送消息,不须要通过什么中介,消息是异步发送和处理的:编程
Actor模型描述了一组为了不并发编程的常见问题的公理:并发
1.全部Actor状态是Actor本地的,外部没法访问。
2.Actor必须只有经过消息传递进行通讯。
3.一个Actor能够响应消息:推出新Actor,改变其内部状态,或将消息发送到一个或多个其余参与者。
4.Actor可能会堵塞本身,但Actor不该该堵塞它运行的线程。异步
更多可见Actor模型专题操作系统
Channel模型中,worker之间不直接彼此联系,而是经过不一样channel进行消息发布和侦听。消息的发送者和接收者之间经过Channel松耦合,发送者不知道本身消息被哪一个接收者消费了,接收者也不知道是哪一个发送者发送的消息。线程
Go语言的CSP模型是由协程Goroutine与通道Channel实现:3d
Actor模型和CSP区别图以下:协程
Actor之间直接通信,而CSP是经过Channel通信,在耦合度上二者是有区别的,后者更加松耦合。htm
同时,它们都是描述独立的流程经过消息传递进行通讯。主要的区别在于:在CSP消息交换是同步的(即两个流程的执行"接触点"的,在此他们交换消息),而Actor模型是彻底解耦的,能够在任意的时间将消息发送给任何未经证明的接受者。因为Actor享有更大的相互独立,由于他能够根据本身的状态选择处理哪一个传入消息。自主性更大些。
在Go语言中为了避免堵塞流程,程序员必须检查不一样的传入消息,以便预见确保正确的顺序。CSP好处是Channel不须要缓冲消息,而Actor理论上须要一个无限大小的邮箱做为消息缓冲。
https://www.jdon.com/concurrent/actor-csp.html