Go语言并发|青训营

100 阅读3分钟

Go语言在性能上比较好的原因就是在语法层面支持了并发,下面简单讲一下并发。

Go语言并发

Go 语言支持并发,我们只需要通过 go 关键字来开启 goroutine 即可。

goroutine 是轻量级线程,goroutine 的调度是由 Golang 运行时进行管理的。

goroutine 语法格式:

go 函数名( 参数列表 )

例如:

go f(x, y, z)

Go 允许使用 go 语句开启一个新的运行期线程, 即 goroutine,以一个不同的、新创建的 goroutine 来执行一个函数。 同一个程序中的所有 goroutine 共享同一个地址空间。

我认为并发最主要的一个作用就是充分利用了多核处理器的特性,让计算机性能得到了充分的利用,同时通过并发也让运行的过程变得更加快速,在这个发展迅速的年代,速度就是最重要的考量指标。回想上个世纪控制火箭发射的电脑的计算性能可能还不如今天的笔记本,就是在这样”艰苦“的条件下,前人们都能控制火箭,那如今拥有了更高性能计算机的我们就应该发扬前人的攻坚克难精神,不断进步,为新时代的建设做出自己的贡献。

通道(channel)

通道(channel)是用来传递数据的一个数据结构。

通道可用于两个 goroutine 之间通过传递一个指定类型的值来同步运行和通讯。操作符 <- 用于指定通道的方向,发送或接收。如果未指定方向,则为双向通道。

ch <- v    // 把 v 发送到通道 ch

v := <-ch  // 从 ch 接收数据 并把值赋给v            `

声明一个通道很简单,我们使用chan关键字即可,通道在使用前必须先创建:

ch := make(chan int) //其中int可以根据实际需要改为其他类型

注意:默认情况下,通道是不带缓冲区的。发送端发送数据,同时必须有接收端相应的接收数据。

通道缓冲区

通道可以设置缓冲区,通过 make 的第二个参数指定缓冲区大小:

ch := make(chan int, 100) //这里的100是缓冲区的大小

带缓冲区的通道允许发送端的数据发送和接收端的数据获取处于异步状态,就是说发送端发送的数据可以放在缓冲区里面,可以等待接收端去获取数据,而不是立刻需要接收端去获取数据。

不过由于缓冲区的大小是有限的,所以还是必须有接收端来接收数据的,否则缓冲区一满,数据发送端就无法再发送数据了。

注意:如果通道不带缓冲,发送方会阻塞直到接收方从通道中接收了值。如果通道带缓冲,发送方则会阻塞直到发送的值被拷贝到缓冲区内;如果缓冲区已满,则意味着需要等待直到某个接收方获取到一个值。接收方在有值可以接收之前会一直阻塞。

总结

上面简单介绍了一下Go语言中并发的基本知识,实际上并发所涉及的远远不止这些,上面只是我以一个初学者的角度所做的一部分简单笔记。

真正要想学好一门语言需要不断的学习,同时也需要每天不断去敲代码,实践才是检验真理的唯一标准,让我们从现在起做出行动,做出改变!