0
点赞
收藏
分享

微信扫一扫

2月摸鱼计划03 从并发编程本质了解Go高性能的本质

2月摸鱼计划03  从并发编程本质了解Go高性能的本质_加锁

1.0 从并发编程本质了解Go高性能的本质

1.1 Goroutine

2月摸鱼计划03  从并发编程本质了解Go高性能的本质_Go_02

2月摸鱼计划03  从并发编程本质了解Go高性能的本质_加锁_03

协程可以理解为轻量级线程

Go更适合高并发场景原因之一:Go语言一次可以创建上万协成

2月摸鱼计划03  从并发编程本质了解Go高性能的本质_Go_04

“快速”:开多个协成 打印。

go func(): 在函数前加 go 代表 创建协程;

time.Sleep(): 协程阻塞,使主协程 在子协程结束前阻塞不退出

乱序输出 说明并行

1.2 协程通信 CSP (Communicating Sequential Processes)

2月摸鱼计划03  从并发编程本质了解Go高性能的本质_Go_05

通过通信共享内存:Channel通道遵循 先入先出 保证顺序

1.3Channel

Channel创建需要通过make()函数;

2月摸鱼计划03  从并发编程本质了解Go高性能的本质_加锁_06

无缓冲通道也称 同步通道;有缓冲:缓冲满了之后要拿走才能存

2月摸鱼计划03  从并发编程本质了解Go高性能的本质_Go_07

通过通信共享内存 例子:

M主函数作为消费者 实际中业务比较复杂,所以会 比 生产者AB慢;我们用 带缓冲的通道 就不会因消费者M的消费速度 影响 生产者的执行效率;

2月摸鱼计划03  从并发编程本质了解Go高性能的本质_共享内存_08

1.4 并发安全Lock

2月摸鱼计划03  从并发编程本质了解Go高性能的本质_共享内存_09

addWithLock() 通过临界区控制实现;在 每次 x+=1前后加解锁

addWithOutLock() 没加锁; Add 测试函数;对两种实现做5个协程并发执行

结果为:加锁时输出预期结果10000;体现不加锁的并发安全问题

1.5 WaitGroup实现并发任务的同步

计算器=0表示所有并发任务结束

2月摸鱼计划03  从并发编程本质了解Go高性能的本质_共享内存_10

1.5.1阻塞的优化

2月摸鱼计划03  从并发编程本质了解Go高性能的本质_加锁_11

好的,以上就是对go并发编程相关概念的介绍,这里简单做个小结

整个章节主要涉及3个方面,一个是协程,通过高效的调度模型实现高并发操作,一个是通道channel.通过通信实现共享内存;最后svnc相关关键字,实现并发安全操作和协程间的同步

举报

相关推荐

0 条评论