Go 笔记之并发
goroutine
-
特点
- 并行程序设计,Go语言层面支持
- goroutine 比线程更小,比thread更易用,高效,轻便
- Go语言内部实现了goroutine之间的内存共享
- goroutine 是通过 Go 的 runtime 管理的一个线程管理器
- 不通过共享来通信,而通过通信来共享。
-
channels
- 同goroutine 运行在相同的地址空间
- 阻塞,也就是如果读取(value := <-ch)它将会被阻塞,直到有数据接收
-
默认情况下,channel 接收和发送数据都是阻塞的,不需要显式的 lock (其内部已经处理了各种锁)
ch <- v // 发送 v 到 channel ch. v := <-ch // 从 ch 中接收数据,并赋值给v
-
Buffered Channels
- go 允许指定channel缓冲大小,即channel可存储的元素
- 在有缓冲的情况下,缓冲数之下,元素可以无阻塞写入通道,超过代码会阻塞,直到有其它goroutine从channel中读取一些元素,让出空间
-
Range 和 Close
- for i := range c 能够不断的读取 channel 里面的数据,直到该 channel 被显式的close关闭
- v,ok := <-ch 测试channel是否被关闭
- 在生产者的地方关闭 channel
-
多个channel
- select 默认阻塞,监听channel,随机选择一个执行
-
超时
- 避免整个程序进入阻塞,用 select 监听来设置超时
运行时 goroutime
指令/常量 | 说明 |
---|---|
Goexit | 退出当前执行的 goroutine,但是 defer 函数还会继续调用 |
Gosched | 让出当前 goroutine 的执行权限,调度器安排其他等待的任务运行,并在下次某个时候从该位置恢复执行 |
NumCPU | 返回 CPU 核数量 |
NumGoroutine | 返回正在执行和排队的任务总数 |
GOMAXPROCS | 用来设置可以并行计算的 CPU 核数的最大值,并返回之前的值。 |
并发分析
- 竞态条件分析工具
- 表现 读写不一致, 对同一资源读写,程序底层是分步进行
-race
参数 开启运行时(runtime)对竞态问题的分析
- 编译分析
- 普通的
go run/build
对编译器进行了优化
- 普通的
- 概念
- 竞态分析
- 编译器优化
sechudler,M,P,G
本作品采用《CC 协议》,转载必须注明作者和本文链接
支持一波