Go语言第二课笔记 | 青训营笔记

大家好,这里是我参加字节跳动【第五期青训营】伴学笔记打卡的第二天。在今天的课程中学习到了并发,协程,通道,lock锁等概念,并尝试用代码进行相关练习

并发与并行

  • 并发(concurrency):把任务在不同的时间点交给处理器进行处理。在同一时间点,任务并不会同时运行。

  • 并行(parallelism):把每一个任务分配给每一个处理器独立完成。在同一时间点,任务一定是同时运行。

并发不是并行。并行是让不同的代码片段同时在不同的物理处理器上执行。并行的关键是同时做很多事情,而并发是指同时管理很多事情,这些事情可能只做了一半就被暂停去做别的事情了。

在很多情况下,并发的效果比并行好,因为操作系统和硬件的总资源一般很少,但能支持系统同时做很多事情。这种“使用较少的资源做更多的事情”的哲学,也是指导 Go语言设计的哲学。

如果希望让 goroutine 并行,必须使用多于一个逻辑处理器。当有多个逻辑处理器时,调度器会将 goroutine 平等分配到每个逻辑处理器上。这会让 goroutine 在不同的线程上运行。不过要想真的实现并行的效果,用户需要让自己的程序运行在有多个物理处理器的机器上。否则,哪怕 Go语言运行时使用多个线程,goroutine 依然会在同一个物理处理器上并发运行,达不到并行的效果。

下图展示了在一个逻辑处理器上并发运行 goroutine 和在两个逻辑处理器上并行运行两个并发的 goroutine 之间的区别。调度器包含一些聪明的算法,这些算法会随着 Go语言的发布被更新和改进,所以不推荐盲目修改语言运行时对逻辑处理器的默认设置。如果真的认为修改逻辑处理器的数量可以改进性能,也可以对语言运行时的参数进行细微调整。

Go语言第二课笔记 | 青训营笔记_第1张图片

Go语言在 GOMAXPROCS 数量与任务数量相等时,可以做到并行执行,但一般情况下都是并发执行。

协程

协程是个抽象概念,它不是系统级线程,很多时候协程被称为“轻量级线程”、“微线程”等。简单来说可以认为协程是线程里不同的函数,这些函数之间可以相互快速切换

协程和用户态线程非常接近,用户态线程之间的切换不需要陷入内核,但部分操作系统中用户态线程的切换需要内核态线程的辅助

协程是编程语言提供的特性(协程之间的切换方式与过程可以由编程人员确定),是用户态操作。协程适用于 IO 密集型的任务。常见提供原生协程支持的语言比较少。

通道Channel

  • 通道是Go语言在语言级别提供的goroutine间的通信方式

  • 有缓冲通道相对于无缓冲通道的一大优势是:当通道双方的收发速度不一致时,缓冲通道可以一定程度避免因为一方的速度慢导致的整个速度降低,可以更“快”。

作者:Rrrrry

链接:https://juejin.cn/post/7189266236801286205

来源:稀土掘金

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

你可能感兴趣的:(笔记,golang)