go语言的并发

go语言并发简介

  1. 类似于线程
  2. 与线程不同的是:
    线程由 os调度
    goroutie由 goruntime 调试
  3. 每个goroutine包含一个任务,需要使用CPU

channel简介

  1. 在go线程之间建立关联

创建goroutine

  • 使用普通函数创建
    go functionName(args)
  • 使用匿名函数创建
    go func(args){
    body
    }(args)

通道 channel

  • 声明通道
    var channelName chan dataType
  • 创建通道
    channelName := make(chan dataType)
  • 发送数据到通道
    channelName <- data
  • 通道阻塞
    1. 发送方在没有接收方处理时
    2. 接收方在通道中没有发送方数据时
    3. 发送方排队发送 直到完成
    4. 接收方排队接收 直到完成
  • channel <- data 通道接收数据
    1. 阻塞模式
      data := <- ch
      执行时阻塞 直到赋值完成
    2. 非阻塞式
      data, ok := <- ch
      高CPU占用 使用非常少
    3. 接收任意数据,然后忽略
      <- ch
      用于并发同步
    4. 循环接收
      for data := range ch {}

单向通道

  1. 声明格式
    var chanName chan <- dataType 仅发送
    var chanName <- chan 仅接收

带缓冲的通道

  • 发送方
    1. 无需等待接收方
    2. 只有存储空间满时才阻塞
  • 接收方
    1. 缓冲通道中有数据 不会阻塞
    2. 通道中无数据时阻塞
  • 创建带缓冲的通道
    c := make(chan int, 3)

通道的多路复用 select