两者都通过让并发实体经由消息通信、而非用锁,来避免共享可变状态 —— actor 拥有私有状态并发送带地址的消息;CSP 则由匿名进程通过 channel 传递值。"不要通过共享内存来通信;要通过通信来共享内存。"
Actor 模型(Erlang、Akka)
每个 actor 有一个私有邮箱,每次处理一条消息。actor 是有名字/地址的,异步发送(fire-and-forget),且从不共享状态 —— 因此在 actor 内部无需锁。监督树(supervision tree)会重启崩溃的 actor。
text
Actor A ──发送消息──▶ [邮箱] Actor B (B 串行处理,拥有自己的状态)
CSP(Go、occam)
进程是匿名的;它们通过 channel 通信。一次发送/接收的会合(rendezvous,无缓冲 channel 会阻塞直到双方都就绪)提供了同步。被命名的实体是 channel,而不是进程。
go
ch := ( )
{ ch <- compute() }()
result := <-ch
