Go语言学习笔记 - PART13 - 协程与通道

协程

应用程序处理并发的部分

  • 协程跟操作系统的线程之间不是一对一的关系
  • 协程是独立执行的,它们之间必须同行才会变得有用

通道

负责协程之间的通信,从而避免所有由共享内存导致的陷阱

  • 通道只能传输一种类型的数据(任意一种类型)
  • 通道声明方式
    var ch1 chan string // 声明一个字符串通道
    ch1 = make(chan string) // 实例化通道
复制代码
  • 通信操作符 : 标识数据的传输,数据按照箭头的方向流动
    // 往通道发送数据
    ch <- i 
复制代码
  • for循环从通道中获取数据
    for v := range ch {
    	fmt.Printf("The value is %v\n", v)
    }
复制代码
  • 指定通道的方向
    var send_only chan<- int 		// 只接收数据的通道
    var recv_only <-chan int		// 只发送数据的通道
复制代码
  • 关闭通道
    • 通道是可以被显示关闭的;只有发送方需要关闭通道,接收方不需要关闭通道
    • close函数关闭通道
      • 将通道标记为无法通过发送操作<-接受更多的值;给已经关闭的通道发送或者再次关闭都会导致运行时的 panic
    • 检测通道是否关闭
    v, ok := <-ch   // 使用, ok操作符检测通道是否关闭
复制代码

协程切换

    select {
    case u:= <- ch1:
           ...
    case v:= <- ch2:
            ...
            ...
    default: // no value ready to be received
            ...
    }
复制代码
  • 通过select关键字,从不同的并发执行的协程中获取值
  • select关键字可以监听进入通道的数据或从通道出去的数据
  • select 要做的事,选择处理列出多个通信情况中的一个
    • 如果都阻塞了,会等待知道其中一个可以处理
    • 如果多个可以处理,随机选择一个
    • 如果没有通道操作可以处理,但写了default语句,它就会执行default(确保不被阻塞)

入门教程推荐: github.com/Unknwon/the…

你可能感兴趣的:(操作系统)