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 协议》,转载必须注明作者和本文链接
pardon110
讨论数量: 1
阿麦

支持一波

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
开发者 @ 社科大
文章
134
粉丝
24
喜欢
101
收藏
55
排名:106
访问:8.9 万
私信
所有博文
社区赞助商