并发编程| 青训营笔记

44 阅读1分钟

这是我参与「第五届青训营 」笔记创作活动的第3天

1、并发与并行

  • 并发: 多线程程序在一个核的cpu上运行
  • 并行: 多线程程序在多个核的cpu上运行
  • go可以充分利用多核优势,高效运行

2、线程和协程

  • 协程: 用户态,轻量级线程,栈MB级别
  • 线程: 内核态,线程跑多个协程,栈KB级别。
  • 在go语言,在语句前面加go就可以创建携程。

3、Channel

  • 代码:make(chan 元素类型,[缓冲大小])
  • 功能:在运行时留有缓存空间
  • 场景:在进行生产和消费时中可以使用

4、Lock

var{
    x   int64
    lock sync.Mutex
}
func addWithLock() {
   for i := 0; i < 2000; i+ {
       Tock.LockO//加锁
       X += 1
       lock.Unlock()//解锁
func addWithoutLock() {
   for i := 日; i < 2000; i+ {
   X += 1
   }
 }

示例中使用多个协程运行,若没加锁输出的结果是未知的

5、WaitGroup

func main() {
    var waitGroup sync.WaitGroup

    start := time.Now()
    waitGroup.Add(5)
    for i := 0; i < 5; i++ {
        go func() {
            defer waitGroup.Done()
            time.Sleep(time.Second)
            fmt.Println("done")
        }()
    }

    waitGroup.Wait()
    fmt.Println(time.Now().Sub(start).Seconds())
}

/*
done
done
done
done
done
1.000306089
*/

示例中使用 Add(5) 表示我们有 5个 子任务,然后起了 5个 协程去完成任务,主协程使用 Wait() 方法等待 子协程执行完毕,输出一共等待的时间。