自从转go后 经常看到go提倡的csp处理并发,一直没有太了解,一是没有碰到对应的需求,二是网上搜csp并发都是些概念,有代码示例的少之又少,不过里一直有个疙瘩,这个csp并发到底是咋回事,最近花了点时间了解了下,下面的代码一看就能看懂了
package main
import (
"fmt"
)
func main() {
// 创建3个channel,A,B和Exit
A := make(chan bool)
B := make(chan bool)
Exit := make(chan bool)
go func() {
// 如果A通道是true,我就执行
for i := 1; i <= 10; i += 2 {
if ok := <-A; ok {
fmt.Println("A 输出", i)
B <- true
}
}
}()
go func() {
defer func() { Exit <- true }() // 这个协程的活干完之后,向主goroutine发送信号
// 如果B通道是true,我就执行
for i := 2; i <= 10; i += 2 {
if ok := <-B; ok {
fmt.Println("B 输出", i)
if i != 10 { // r如果i等于10了,就不要再向A通道写数据了,否则将导致A通道死锁,至于为什么,坦白说我很疑惑
A <- true
}
}
}
}()
A <- true // 启动条件
<-Exit // 结束条件
}