第六届字节跳动青训营第二课 | 青训营

91 阅读2分钟

1.1并发和并行

多线程程序在单核心的 cpu 上运行,称为并发

1691581880974.png

多线程程序在多核心的 cpu 上运行,称为并行

image.png

并发与并行并不相同,并发主要由切换时间片来实现“同时”运行,并行则是直接利用多核实现多线程的运行,Go程序可以设置使用核心数,以发挥多核计算机的能力。

Go语言的优势就是可以充分发挥多核优势,高效运行。

1.2线程

进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位

线程是进程的一个执行实体,是 CPU 调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。

一个进程可以创建和撤销多个线程,同一个进程中的多个线程之间可以并发执行。

image.png

1.2.1 快速打印(协程)

func hello(i int) {
   println("helle :" + fmt.Sprint(i))
}

func main() {
   for i := 0; i < 5; i++ {
      go func(j int) {
         hello(j)
      }(i)
   }
   time.Sleep(time.Second)
}

运行后可以看到,结果是乱序输出的。

1.2.2 协程通信共享内存

go语言的最大两个亮点,一个是goroutine,一个就是channel了。二者合体的典型应用CSP,基本就是大家认可的并行开发神器,简化了并行程序的开发难度。

image.png

Go 通过 channel 实现 CSP 通信模型,主要用于 goroutine 之间的消息传递和事件通知。 有了 channel 和 goroutine 之后,Go 的并发编程变得异常容易和安全,得以让程序员把注意力留到业务上去,实现开发效率的提升。

1.2.3 channel

Channel是Go中的一个核心类型,你可以把它看成一个管道,通过它并发核心单元就可以发送或者接收数据进行通讯。

它的操作符是箭头 <- 。

image.png