Go语言进阶 | 青训营

65 阅读3分钟

GO语言进阶

01.并发和并行

并发和并行是不同的,首先并发一般是使用单核进行运行,是多线程在一个核心的cpu上运行,此时cpu就需要在多个线程间来回切换,为何我们感觉不到它来回切换,其实就是因为切换速度太快了,对于人来说根本察觉不到。其次就是并行,并行是多线程在多个核的cpu上运行,这个运行效率就会好很多,我们的Go语言就可以充分发挥多核优势,高效运行。

02.Goroutine

首先需要知道一个概念就是协程,在我看来协程其实就是再把线程进行划分划分成更小的单位,所以协程更加轻量级,栈是KB级别,运行时也会更加高效。线程我在Java中学习过,线程其实就是我们打开一个软件后进行的一次行为,线程可以跑多个协程,栈是MB级别的,相比协程来说效率肯定是要低的。在Go语言中有了协程,从而更加适合高并发场景了。

如何去开启一个协程,我们可以在函数方法前加一个go的关键字,例如go func()这样子的,就可以开启协程进行这个函数操作。但是需要注意,我们在使用协程时必须保持主线程一直存在,如果主线程销毁了,子协程也会跟着销毁,所以我们在学习更多知识之前如果单纯只使用一个协程函数,我们就需要在主线程中加入一个time.Sleep(time.Second * n)命令,这个命令我们可以根据自己的需求设定n,这里的n是你想让这个线程阻塞n秒。

03.CSP

GO语言一般是通过通信共享内存的是Goroutine1将信息发送给一个channel(通道),然后channel将信息依次按照先进先出的顺序发送给Goroutine2和Goroutine3。

Channel语法:有缓冲的:make(chan int,2),无缓冲的:make(chan int)

04.并发安全Lock

在GO语言中可能会存在多个协程同时操作一块内存的情况,这个时候我们想要让一个协程去操作一块内存,我们就可以给这个协程加上锁Lock,这样的话可以保证并发的安全,语法一般是先定义一个锁lock sync.Mutex,然后在自己想要操作的协程前后分别加上lock.Lock()lock.Unlock()

05.WaitGroup

这个语法就是time.Sleep的平替了,非常好用。因为我们无法得知主线程运行的时间,所以我们也不能经常使用time.Sleep去阻塞线程让协程运行,这时候我们可以使用WaitGroup。WaitGroup实质就是个计数器,它可以在协程开启前让计数器加一,然后在协程结束后让计数器减一,从而让主线程知道协程在这个时候执行完了,主线程可以结束了。

语法:WaitGroup.Add(delta int)表明计数器+delta,WaitGroup.Done()表示计数器减1,WaitGroup.Wait()表示计数器为0,可以结束阻塞了。