Go语言进阶|青训营

73 阅读3分钟

1.go语言并行优势

1.所谓并发就是,单核cpu在处理进程时,将cpu的处理时间切分成多个时间片,供给多个进程分别使用,当某一进程的时间片使用结束,进程转为阻塞态或者是发生io输入输出阻塞,中断,cpu去处理其他进程,这样宏观上实现了,所有任务都在被cpu同时处理的假象,提高了cpu的运行效率 2.并行就是真正的同步运行,多核cpu情况下,多个不同任务在不同处理器上被处理,高效简洁,且不用涉及所谓因为时间片或者输入输出而发生的切换任务,免去了很多算法的设计,go语言就具有这种优势

2.协程

协程:独立的栈空间,共享堆空间,调度由用户自己控制,本质上有点类似于用户级线程,这些用户级线程的调度也是自己实现的。 线程:一个线程上可以跑多个协程,协程是轻量级的线程。 优雅的并发编程范式,完善的并发支持,出色的并发性能是Go语言区别于其他语言的一大特色。

3.goroutine

goroutine 是一种非常轻量级的实现,可在单个进程里执行成千上万的并发任务,它是Go语言并发设计的核心。 说到底 goroutine 其实就是线程,但是它比线程更小,十几个 goroutine 可能体现在底层就是五六个线程,而且Go语言内部也实现了 goroutine 之间的内存共享。 使用 go 关键字就可以创建 goroutine,将 go 声明放到一个需调用的函数之前,在相同地址空间调用运行这个函数,这样该函数执行时便会作为一个独立的并发线程,这种线程在Go语言中则被称为 goroutine。

4.channel

channel 是Go语言在语言级别提供的 goroutine 间的通信方式,使用 channel 在两个或多个 goroutine 之间传递消息。 channel 是进程内的通信方式,因此通过 channel 传递对象的过程和调用函数时的参数传递行为比较一致,比如也可以传递指针等。如果需要跨进程通信,我们建议用分布式系统的方法来解决,比如使用 Socket 或者 HTTP 等通信协议。Go语言对于网络方面也有非常完善的支持。

image.png

在linux系统下,不同进程经常使用临界区来实现通信,但是使用临界区会产生一系列问题,比如如何实现互斥访问,生产者消费者问题。goroutine通过通道channel直接实现通信共享内存,我的认为是goroutine本身十分轻量级,直接通信的成本非常廉价,而进程本身很庞大,如果直接通信,还需要pcb保存当前状态,以及内核态和用户态的切换,不容易实现。

5. 生产者消费者问题

image.png A协程发送0-9的数字 B协程计算平方 主协程输出最后答案

首先创建了src和dest两个通道 src仅限于整型对象的传输 dest同且拥有三个临界区 利用go关键词创建子协程 A B boss 三人同时干活,A往里放东西,src没有缓存区,A放一个B就要拿一个,B拿走一个算完了就往dest里面放,dest类似于生产者的货架,不管有没有消费者消费,只要货架空位!=0,就往货架上摆放货物,生产者(boss)主协程输出内容。这就是go语言并行的优势。

未完待续-----