go语言并发简介
- 类似于线程
- 与线程不同的是:
线程由 os调度
goroutie由 goruntime 调试
- 每个goroutine包含一个任务,需要使用CPU
channel简介
- 在go线程之间建立关联
创建goroutine
- 使用普通函数创建
go functionName(args)
- 使用匿名函数创建
go func(args){
body
}(args)
通道 channel
- 声明通道
var channelName chan dataType
- 创建通道
channelName := make(chan dataType)
- 发送数据到通道
channelName <- data
- 通道阻塞
- 发送方在没有接收方处理时
- 接收方在通道中没有发送方数据时
- 发送方排队发送 直到完成
- 接收方排队接收 直到完成
- channel <- data 通道接收数据
- 阻塞模式
data := <- ch
执行时阻塞 直到赋值完成
- 非阻塞式
data, ok := <- ch
高CPU占用 使用非常少
- 接收任意数据,然后忽略
<- ch
用于并发同步
- 循环接收
for data := range ch {}
单向通道
- 声明格式
var chanName chan <- dataType 仅发送
var chanName <- chan 仅接收
带缓冲的通道
- 发送方
- 无需等待接收方
- 只有存储空间满时才阻塞
- 接收方
- 缓冲通道中有数据 不会阻塞
- 通道中无数据时阻塞
- 创建带缓冲的通道
c := make(chan int, 3)
通道的多路复用 select