channel 的用法
go语言实现了CSP(communicating sequential process)的通讯模型, 即两个并发的实体,通过共享管道的方式进行通信,不关注通信的实体如何,只需要关注channel的状态和数据即可。
用法
1、goroutinue 之间的同步与互斥
同步:状态的同步、消息的同步等,groutinue 之间通过读写的channel来实现同步
互斥:资源的互斥访问,goroutinue 优先读取buffer channel的数据,读不到阻塞,读到后处理,写入数据,通过这种方式来实现互斥,申请的buffer channel大小为 1。
2、消息投递、消息订阅
3、作为信号使用,比如关闭close 所以的读阻塞goroutinue 都会收到信号。
select 结合使用方式
select {
case <- channelResult:
case default:
}
这样的情况下,select 只能执行一次
与for 一块使用,可以执行多次,每次select , 如下:
for {
select {
case <- channelResult:
case default:
}
}
和for 一块使用必须注意退出条件,避免成死循环
和range 一块使用需要主要range 会一直执行,直到收到 channel的close信号为止,否则会一直阻塞。