golang 并发
golang 的并发编程范式
并行:程序在任意时刻都是同时运行
并发:程序在单位时间内是同时运行(避免阻塞、分时操作)
go 并发执行体称为goroutine
go语言 通过 go 关键字来启动一个goroutine.(go的后面必须跟一个函数)
go func() {
......
}
goroutinue有如下特性:
1. go的执行是非阻塞的,不会等待
2. go后面的函数的返回值会被忽略
3. 调度器不能保证多个goroutine的执行次序
4. 没有父子goroutine的概念,所有的goroutine是平等的被调度和执行
5. go程序在执行时会单独为main函数创建一个goroutine,遇到其它go关键字时再创建其它的goroutine
6. go没有暴露goroutine id给用户,所以不能在一个goroutine里面显示地操作另一个goroutine,但runtime包提供了一些函数访问和设置goroutine的相关信息
goroutinue间需要通信、同步、协同
go通过通信来共享内存的载体是chan(通道)
chan中可以存储goroutinue产生的数据
ch := make(chan int, 10)
ch <- rand.Int() // 通道写入
<-ch // 通道写出
goroutines 工作线程池
select 扇入扇出(fan in、fan out)