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

如何深入浅出地解释并发模型中的 CSP 模型,第1张

因为Node.js的缘故导致我在业余时对消息传递系统很感兴趣,所以抛砖引玉,先来简单谈谈Actor和CSP以及它们的区别?CSP(Communicating Sequential Process)模型和Actor模型是两门非常复古且外形接近的并发模型。但CSP与Actor有以下几点野喊孙比较大的区别:CSP并不Focus发送消息的实体/Task,而是关注发送消息时消息所使用的载体,即channel。在Actor的设计中,Actor与信箱是耦合的,而在CSP中channel是作颂链为first-class独立存在的。另外一点在于,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),因此上面的解释也可能有部分地方存在偏颇,还望指点~

Go的CSP并发模型

Go实现了两种并发形式。第一种是大家普遍认知的:多线程共享内存。其实就是Java或者C++等语言中的多线程开发。另外一种是Go语言特有的,也是判岁者Go语言推荐的:CSP(communicating sequential processes)并发模型。

CSP 是 Communicating Sequential Process 的简称,中文可以叫做通信顺序进程,是一掘薯种并发编程模型,由 Tony Hoare 于雀凯 1977 年提出。简单来说,CSP 模型由并发执行的实体(线程或者进程)所组成,实体之间通过发送消息进行通信,这里发送消息时使用的就是通道,或者叫 channel。CSP 模型的关键是关注 channel,而不关注发送消息的实体。 Go 语言实现了 CSP 部分理论

“ 不要以共享内存的方式来通信,相反, 要通过通信来共享内存。”

Go的CSP并发模型,是通过 goroutine和channel 来实现的。

goroutine 是Go语言中并发的执行单位。其实就是协程。

channel是Go语言中各个并发结构体(goroutine)之前的通信机制。 通俗的讲,就是各个goroutine之间通信的”管道“,有点类似于Linux中的管道。

Channel

Goroutine


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12395619.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存