Goroutines的基石(CSP)是什么原理?
1 CSP
CSP可以被理解成一个简单的概念。我们现在有一个处理过程,有一个输入,期待一个输出。
CSP中的处理过程
!用于向处理过程发送输入。
lineprinter!lineimage
向lineprinter发送打印用的lineimage的值。
?用于读取进程的输出
cardreader?cardimage
从cardreader读取一张卡片,并将其值(一个字符数组)分配给变量cardimage。
CSP描述的主要概念是同步和Guarded命令。
1.1 同步
在CSP下通信的两个处理过程(同步的例子)。
在上述同步的例子中。
1. 过程P1通过输出命令(!)向进程P2输出 "a"的值。
2. 通过输入命令(?)处理P2的输入值,并将其赋值给"x"。
1.2 Guarded命令
守护命令是一个形式为G→S的语句,其中
l G是一个命题,称为guard
l S是一个声明
所以简单的说就是左手边(G)作为条件,或者右手边(S)作为guard。
结合Guarded命令和I/O命令,CSP举例如下:
*[c:character; west?c → east!c]
读取west输出的所有字符,并逐一输出到east。当进程west终止时,过程终止。
上面这个表述和Go的channel很相似。Guarded 命令构成了Go的channel的基础。
ch <- v // 将v发送到通道ch。
v := <-ch // 接收来自ch的值并复制给v
2 参考
https://en.wikipedia.org/wiki/CSP
https://godoc.org/github.com/thomas11/csp
https://en.wikipedia.org/wiki/Communicating_sequential_processes
- 点赞
- 收藏
- 关注作者
评论(0)