当前位置:网站首页>go——并发编程
go——并发编程
2022-08-03 10:08:00 【Meme_xp】
go语言常用的并发模型
并发模型说的是系统中的线程如何协作完成并发任务,不同的并发模型,线程以不同的方式进行通信和协作。
线程间通信方式
线程间通信方式有两种︰共享内存和消息传递,无论是哪种通信模型,线程或者协程最终都会从内存中获取数据,所以更为准确的说法是直接共享内存、发送消息的方式来同步信息
1.共享内存
抽象层级︰抽象层级低,当我们遇到对资源进行更细粒度的控制或者对性能有极高要求的场景才应该考虑抽象层级更低的方法
耦合:高,线程需要在读取或者写入数据时先获取保护该资源的互斥锁
线程竞争:需要加锁,才能避免线程竞争和数据冲突
2.发送消息
抽象层级︰抽象层级高,提供了更良好的封装和与领域更相关和契合的设计,比如Go语言中的Channel就提供了Goroutine之间用于传递信息的方式,它在内部实现时就广泛用到了共享内存和锁,通过对两者进行的组合提供了更高级的同步机制
耦合:低,生产消费者模型
线程竞争∶保证同一时间只有一个活跃的线程能够访问数据,channel维护所有被该chanel阻塞的协程,保证有资源的时候只唤醒一个协程,从而避免竞争
共享内存

csp并发模型
通过发送消息的方式来同步信息,Go语言推荐使用的通信顺序进程(communicating sequential processes)并发模型,通过goroutine和channel来实现
1.goroutine是Go语言中并发的执行单位,可以理解为"线程”
2.channel是Go语言中各个并发结构体( goroutine )之前的通信机制。通俗的讲,就是各个goroutine 之间通信的"管道",类似于Linux中的管道

go语言中有哪些并发同步源语?

Channel
channel管道,高级同步原语,goroutine之间通信的桥梁
使用场景:消息队列、数据传递、信号通知、任务编排、锁
基本并发原语
Go语言在 sync包中提供了用于同步的一些基本原语,这些基本原语提供了较为基础的同步功能,但是它们是一种相对原始的同步机制,在多数情况下,我们都应该使用抽象层级更高的Channel实现同步。
常见的并发原语如下:
sync.Mutex
sync.RMMutex
sync.waitGroup
sync.Cond
sync.Once
sync.Pool
sync.Context
Go有哪些方式可以安全读写变量

如何排查数据竞争问题
概念
只要有两个以上的goroutine并发访问同一变量,且至少其中的一个是写操作的时候就会发生数据竞争﹔全是读的情况下是不存在数据竞争的。
go命令行参数race就是检查数据竞争问题的!
边栏推荐
- LeetCode_多叉树_中等_429.N 叉树的层序遍历
- Scrapy + Selenium 实现模拟登录,获取页面动态加载数据
- Mysql OCP 29题
- js中最简单base64图片流实现自动下载
- SAP Analytics Cloud 和 SAP Cloud for Customer 两款 SaaS 软件的集成
- 训练双塔检索模型,可以不用query-doc样本了?明星机构联合发文
- Interview Blitz 71: What's the difference between GET and POST?
- Redis和MySQL如何保持数据一致性
- Mysql OCP 72 questions
- MySQL的分页你还在使劲的limit?
猜你喜欢

Leecode-SQL 1527. 模糊查询匹配(模糊查询用法)

Interview Blitz 71: What's the difference between GET and POST?

慢 SQL 分析与优化

ImportError: DLL load failed with error code -1073741795

面试突击71:GET 和 POST 有什么区别?

VL53L0X V2激光测距传感器 采集距离数据串口输出

Mysql OCP 29题

select statement in go

4 g acquisition ModbusTCP turn JSON MQTT cloud platform

ECCV2022 | RU&谷歌:用CLIP进行zero-shot目标检测!
随机推荐
2022.8.2-----leetcode.622
MySQL的存储过程
Leecode-SQL 1527. 模糊查询匹配(模糊查询用法)
How to deal with this time of MySQL binlog??
error C2872: “flann”: 不明确的符号 解决方法
go中select语句
GO开发环境配置
集成学习、boosting、bagging、Adaboost、GBDT、随机森林
Go操作Redis数据库
pixel手机升系统
Ultra-detailed Asp.net uses SSL two-way authentication, one article is enough
pytorch安装错误
SQL教程之递归 CTE Common Table Expression
Oracle数据库表空间整理回收与释放操作
Mysql OCP 73 questions
With strong network, China mobile to calculate excitation surging energy network construction
MySql的初识感悟,以及sql语句中的DDL和DML和DQL的基本语法
type=“module“ 你了解,但 type=“importmap“ 你知道吗
sql server 批量更新数据多张表 更高效的方法
三大产品力赋能欧萌达OMODA5