Go chan
chan
Channel是Go中的一个核心类型,可以把它看成一个管道,通过它并发核心单元就可以发送或者接收数据进行通讯(communication)。
receive 操作符
<-ch
用来从channel ch中接收数据,这个表达式会一直被block,直到有数据可以接收。
从一个nil channel中接收数据会一直被block。
从一个被close的channel中接收数据不会被阻塞,而是立即返回,接收完已发送的数据后会返回元素类型的零值(zero value)。
关闭判断
v, ok := <-ch
一个关闭的通道不会影响读取,可以通过第二个参数获取关闭状态;
chan超时控制
go 中实现超时控制的时候, select-case,粗糙地在超时的时候返回而不管尚在执行中的 goroutine 的死活。结果是,大批量调用受到几个调用超时的影响,一直超时无法恢复。
context 可以设置超时处理,解决超时退出下 goroutine 的退出问题。
案例:比如抢购锁的使用
https://ictar.xyz/2018/03/20/如何用go实现超时控制/
生产消费
package main
import "fmt"
func Producer(ch chan int) {
for i := 1; i <= 10; i++ {
ch <- i
}
close(ch)
}
func Consumer( ch chan int, done chan bool) {
for {
value, ok := <-ch
if ok {
fmt.Printf(" recv: %d\n", value)
} else {
fmt.Printf("closed\n")
break
}
}
done <- true
}
func main() {
ch := make(chan int)
done := make(chan bool)
go Producer(ch)
go Consumer( ch, done)
<-done
}
发布订阅