go中CSP模型提倡“不要以共享内存的方式来通信,相反,要以通信来共享内存”,go的CSP模型,就是通过goroutine和channel结合的形式来实现的。
这里通过goroutine和channel实现了一个简单的并发控制,即通过channel在不同的goroutine之间传递信息,而不是通过锁的形式,或者是共享变量的形式来实现。
例如要实现3个goroutine交替输出1-30的数字,可以参考下面的实现方法:
下方会有解释
func getWorker(waitCh chan int, symbol int, wg *sync.WaitGroup) (next chan int) {
notify := make(chan int)
wg.Add(1)
go func(waitCh chan int) {
defer func() {
wg.Done()
}()
for d := range waitCh {
if d >= 30 {
break
}
fmt.Println("goroutine:", symbol, "print", d+1)
notify <- d + 1
}
close(notify)
fmt.Println("goroutine: finish", symbol)
}(waitCh)
return notify
}
func main() {
wg := new(sync.WaitGroup)
start := make(chan int)
lastCh := start
for i := 0; i < 3; i++ {
lastCh = getWorker(lastCh, i+1, wg)
}
start<-0
for v