go 并发
goroutine
- goroutine是Go并行设计的核心。goroutine说到底其实就是协程,但是它比线程更小
- Go语言内部帮你实现了这些goroutine之间的内存共享
- 执行goroutine只需极少的栈内存(大概是4~5KB),当然会根据相应的数据伸缩。也正因为如此,可同时运行成千上万个并发任务
- goroutine比thread更易用、更高效、更轻便
- goroutine是通过Go的runtime管理的一个线程管理器。goroutine通过go关键字实现了,其实就是一个普通的函数。
1
go hello(a,b,c)
channels
定义一个channel时,也需要定义发送到channel的值的类型,
注意:必须使用make 创建channel
channel通过操作符<-来接收和发送数据
1 | var c = make(chan int) |
默认情况下,channel接收和发送数据都是阻塞的
buffered channels (带缓冲的channels)
1 | ch := make(chan type,value) |
注意:
- range (使用range方法读取channels里面的数据)
- close() 关闭channel,应该在生产者
1 | package main |
select (switch切换channel)
select默认是阻塞的,只有当监听的channel中有发送或接收可以进行时才会运行,当多个channel都准备好的时候,select是随机的选择一个执行的。
1 | package main |
select设置超时
1 | func main() { |
runtime gotoutine
runtime包中有几个处理goroutine的函数:
- Goexit
退出当前执行的goroutine,但是defer函数还会继续调用
- Gosched
让出当前goroutine的执行权限,调度器安排其他等待的任务运行,并在下次某个时候从该位置恢复执行。
- NumCPU
返回 CPU 核数量
- NumGoroutine
返回正在执行和排队的任务总数
- GOMAXPROCS
用来设置可以并行计算的CPU核数的最大值,并返回之前的值。