go 并发编程

82 阅读1分钟

主要目的还是回顾一下并发编程的基础知识(毕竟学go的大部分应用场景都需要高并发),然后对例题进行了一些记录。

go中channel的应用场景

image.png

已经关闭的channel可以继续取值,但是不能再放值了。

image.png

#单向channel使用实例

image.png

image.png

*练习

使用俩个go routine交替打印序列,一个go routine 打印数字,另外一个打印字母 如下 12ab34cd....

package main

import (
   "fmt"
   "time"
)

var number, letter = make(chan bool), make(chan bool)

// 首先创建一个打印数字的go routine
func printNum() {
   i := 1
   for {
      //难点是如何等待另一个goroutine通知
      <-number

      fmt.Printf("%d%d", i, i+1)
      i += 2
      letter <- true
   }
}

func printLetter() {
   i := 0
   str := "abcdefghijklmnopqrstuvwxyz"
   for {
      //难点是如何等待另一个goroutine通知
      <-letter
      if i >= len(str) {
         return
      }
      fmt.Printf(str[i : i+2])
      i += 2
      number <- true
   }
}

func main() {
   /*
      使用俩个go routine交替打印序列,一个go routine 打印数字,另外一个打印字母
      如下 12ab34cd....
   */
   go printNum()
   go printLetter()
   number <- true
   time.Sleep(time.Second * 100)

}

重点在于练习channel的创建以及<-值传递符号的使用

context使用

注意子ctx可以调用父ctx中的canel

image.png