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

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

时间:2024-02-05 22:32:12浏览次数:27  
标签:03 加锁 协程 缓冲 本质 并发 go Go

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

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

1.1 Goroutine

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

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

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

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

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

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

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

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

乱序输出 说明并行

1.2 协程通信 CSP (Communicating Sequential Processes)

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

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

1.3Channel

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

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

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

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

通过通信共享内存 例子:

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

2月摸鱼计划03  从并发编程本质了解Go高性能的本质_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相关关键字,实现并发安全操作和协程间的同步

标签:03,加锁,协程,缓冲,本质,并发,go,Go
From: https://blog.51cto.com/u_16557322/9613855

相关文章

  • 小兔鲜儿 uniapp - uni.request 请求封装 2月摸鱼计划03
    uni.request请求封装添加请求和上传文件拦截器uniapp拦截器:uni.addInterceptor接口说明:接口文档实现步骤基础地址超时时间请求头标识添加token参考代码//src/utils/http.tsconsthttpInterceptor={//拦截前触发invoke(options:UniApp.RequestOptions){//1.......
  • client-go http trace分析耗时
    klog.InitFlags(nil)flag.Parse()deferklog.Flush()cfg,err:=clientcmd.BuildConfigFromFlags("","/root/.kube/config")iferr!=nil{ klog.Fatalf("Errorbuildingkubeconfig:%s",err.Error())}kubeClient,err:=kubern......
  • [转][Centos]安装 gogs
    也可以从https://gogs.io下载安装参考:https://blog.csdn.net/hahofe/article/details/1172919201、包管理安装#获取安装源sudowget-O/etc/yum.repos.d/gogs.repohttps://dl.packager.io/srv/gogs/gogs/main/installer/el/7.repo#开始下载安装sudoyuminstallgogs......
  • 在我的VS2019中重新配置2017项目生成的google test 项目
    原来的项目是其他版本的VS配置的,自己下载下来时候,本机也没有装GoogleTest所以用不起。如果重建项目在一个个引入工程代码太麻烦(文件多),所以我就想着有没有什么办法快捷配置,不用重建工程以下是我的一个配置方法,供大家交流学习:1.首先你本机要安装上GoogleTest,安装方法自查;2.如......
  • MongoDB配置用户账号与访问控制
    1.admin库创建root角色权限的用户db.createUser({user:"root",pwd:"123qwe",roles:["root"]})2.修改mongo配置文件,开启用户名密码连接验证security:authorization:enabled3.cmd关闭mongo服务netstopMongoDB4.cmd启动mongo服务netstartMongoDB直接localhost连接......
  • 洛谷题单指南-递推与递归-P1044 [NOIP2003 普及组] 栈
    原题链接:https://www.luogu.com.cn/problem/P1044题意解读:一组数入栈、出栈的方案数,如果了解卡特兰数,此题可以秒杀;如果不了解,也可以通过递归或者递推来解决;最次,可以通过DFS暴搜出方案数,当然对于n个数,一共有n次入栈、n次出栈,一共2n次,每次要么入栈要么出栈,总搜索次数在22n规模,n最......
  • SQL数据库入门03:数据库表的完整性约束、索引与视图的操作
      本文介绍基于MicrosoftSQLServer软件,实现数据库表完整性约束、索引与视图的创建、编辑与删除等操作的方法。(数据库基础(三):完整性约束、索引、视图)  系列文章中示例数据来源于《SQLServer实验指导(2005版)》一书。依据本系列文章的思想与对操作步骤、代码的详细解释,大家用......
  • go 项目构建
    Go准备依赖环境:golang参考官网地址:https://golang.google.cn/dl/开发工具:可使用jetbrian的Go,但是需要付费,免费也就30天试用,没有社区版。Idea安装Go-plugin插件。插件地址:https://plugins.jetbrains.com/plugin/9568-go/versions/stable以Module形式导入应用因Go项目......
  • go-carbon v2.3.8 发布,轻量级、语义化、对开发者友好的 golang 时间处理库
    carbon是一个轻量级、语义化、对开发者友好的golang时间处理库,支持链式调用。目前已被awesome-go收录,如果您觉得不错,请给个star吧github.com/golang-module/carbongitee.com/golang-module/carbon安装使用Golang版本大于等于1.16//使用github库goget-ugithu......
  • 【2024-02-03】连岳摘抄
    23:59但我相信,能打败黑暗的,不是强大的魔力,而是生活中的小事和微小的爱。                                                 ——托尔金教育离不开考试,考试就只能考智......