Golang与Erlang消息传递对比

csp模型

Golang的消息传递是csp模型,发送与接受消息是通过channel,就是利用共享内存来传递消息,不同的goroutine通过channel共享内存,但是goroutine的消息位置在channel buffer是复制产生的,不在乎那个对象发送或接受消息.发送者和接受者之间由channel松耦合,发送者并不知道自己的消息被那个接收者处理,接收者也不知道是哪一个发送的消息,发送者发送消息需要知道消息是否被处理,则会阻塞,为同步通信.

actor模型

在Erlang可以创建轻量级的process(包含os的process),类似与Golang中的goroutine,在创建process成功会返回唯一的标识pid(在Golang中,一般不容易获取goroutine的id,只能自己创建),对于这个创建的process就相当于一个actor对象,每个actor就像是Golang中select与channel组成的多路复用器(multiplexing).消息的收发并不是直接发送process,每个actor都有自己的mailbox,根据传入的顺序存储.读取消息的则是通过FIFO的顺序取出,然后通过模式匹配寻找对应的处理方式(选择性接收).erlang基于actor模式来传递消息,对象之间直接传递消息,不需要中间件,每个actor都可以收发消息.发送消息将消息复制到process(每个process有独立的内存空间,自行维持自身状态,不共享内存).发送消息者不在乎消息是否被处理,发送者不会阻塞,为异步通信.