如何深入浅出地解释并发模型中的 CSP 模型?

作者:匿名用户
链接:https://www.zhihu.com/question/26192499/answer/46345499
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
 

好像没什么人回答,因为Node.js的缘故导致我在业余时对消息传递系统很感兴趣,所以抛砖引玉,先来简单谈谈Actor和CSP以及它们的区别?

CSP(Communicating Sequential Process)模型和Actor模型是两门非常复古且外形接近的并发模型。但CSP与Actor有以下几点比较大的区别:

  1. CSP并不Focus发送消息的实体/Task,而是关注发送消息时消息所使用的载体,即channel。
  2. 在Actor的设计中,Actor与信箱是耦合的,而在CSP中channel是作为first-class独立存在的。
  3. 另外一点在于,Actor中有明确的send/receive的关系,而channel中并不区分这样的关系,执行块可以任意选择发送或者取出消息。

 

另外默认情况下的channel是无缓存的, 对channel的send动作是同步阻塞的,直到另外一个持有该channel引用的执行块取出消息(channel为空),反之,receive动作亦然。藉此,我们可以得到一个基本确定的事实,by default时,实际的receive操作只会在send之后才被发生。而Actor中,由于send这个动作是异步的,因此Actor的receive会按照信箱接受到消息的顺序来进行处理。

当然,除此以外,channel还有种Buffered Channel的模式,在默认情况的基础上,你可以确定channel内的消息数量,当channel中消息数量不满足于初始化时Buffer数目时,send动作不会被阻塞,写入操作会立即完成(因此Buffered Channel在很大程度上与Actor非常接近),直到Buffer数目已满,则send动作开始阻塞。

最后,一个简单的CSP程序 in golang:

package main

import "fmt"

var ch = make(chan string)

func message(){
    msg := <- ch
    fmt.Println(msg)    
}

func main(){
    go message()
    ch <- "Hello,CSP."
}



当然,无论是Clojure还是Go,我都实在算不上熟悉(因为需要了解这些模型,我之前现学的..orz),因此上面的解释也可能有部分地方存在偏颇,还望指点~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值