当前位置: 首页 > news >正文

golang并发编程——概述

Goroutine

Go 协程(Goroutine)是 Go 语言提供的一种轻量级线程,由 Go 运行时来管理。是与其他函数同时运行的函数,它们是并发执行代码的基础。

在函数调用前加上 go 关键字,这次调用就会在一个新的 goroutine 中并发执行。当被调用的函数返回时,这个 goroutine 也自动结束。

需要注意的是,如果这个函数有返回值,那么这个返回值会被丢弃。

Go 协程(Goroutine)之间通过通道(channel)进行通信,简单的说就是多个协程之间通信的管道。通道可以防止多个协程访问共享内存时发生资源争抢的问题。

Channel 通道

在Go语言中,通道(Channel)是一种数据类型,用于在多个 goroutine 之间进行通信和同步。通道提供了一种安全、高效的方式,用于传递 数据控制信息 。以下是关于通道的一些重要特性和使用方法:

特性和概念

  1. 并发安全性
    • 通道本质上是并发安全的,多个goroutine可以安全地向通道发送(send)和接收(receive)数据,无需额外的显式同步操作。
  2. 阻塞特性
    • 发送和接收操作可以是阻塞的,这意味着当没有数据可发送或接收时,goroutine可能会暂时阻塞在发送或接收操作上,直到数据可用或者通道就绪。
  3. 通信顺序
    • 通道保证发送和接收操作的顺序是一致的,即发送的数据会按照发送的顺序被接收。
  4. 关闭通道
    • 可以通过 close() 函数关闭通道,关闭后的通道不再允许发送数据,但仍可以接收已有数据。关闭的通道可以用来通知接收方没有更多的数据。
  5. 容量
    • 通道可以是有限容量的,即在创建时可以指定通道能够缓存的元素数量。有容量的通道在缓存未满时允许发送操作立即完成,而无需等待接收方接收。

select语句

在 Go 语言中,select 语句是一种控制结构,允许一个 Goroutine 同时等待多个通道操作。select 语句会阻塞,直到其中的一个 case 可以继续执行,然后执行该 case 中的语句。select 语句是处理并发任务时非常有用的工具,特别是需要处理多个通道的通信时。

同步原语

控制原语(Control Primitives)是并发编程中用于管理和协调多个线程或协程的基本构建块。它们帮助程序确保资源的正确使用和状态的一致性。

并发模式

并发模式是指在并发编程中常用的设计模式和方法,用于有效地管理和协调多个并发任务。

  1. 工作池(Worker Pool)
  2. 扇入(Fan-in)
  3. 扇出(Fan-out)
  4. 管道(Pipeline)
  5. 多路复用(Multiplexing)
  6. 生产者-消费者(Producer-Consumer)

Context 上下文

在 Go 语言中,context 包提供了一种用于在 API 边界上传递请求范围数据、取消信号和截止日期的方式。context 包主要用于在不同的 Goroutine 之间共享上下文信息,常用于处理请求生命周期管理、超时控制、取消信号传递等场景。

并发安全和竞态条件

在并发编程中,并发安全(Concurrency Safety)和竞态条件(Race Condition)是两个重要的概念。理解并解决这些问题对于编写高效和可靠的并发程序至关重要。

内存模型

在并发编程中,内存模型描述了程序中线程或 Goroutine 如何与内存进行交互。了解内存模型对编写并发安全的程序至关重要。Go 语言的内存模型定义了对共享变量的访问顺序规则,确保在并发环境下的程序行为是可预测的。

Go 内存模型概述

Go 的内存模型主要通过以下规则来保证内存操作的可见性和一致性:

  1. 程序顺序规则:在单个 Goroutine 中,内存操作按程序顺序执行。
  2. 传递性规则:如果操作 A 在操作 B 之前,且操作 B 在操作 C 之前,那么操作 A 必须在操作 C 之前。
  3. 同步操作规则:通过 sync/atomic 包的原子操作和 sync 包的同步原语(如互斥锁、通道)来定义内存操作之间的同步关系。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • sql中exist和in的区别
  • 240828-Gradio结合Html+Css+Javascript制作年历
  • Open3D编译安装
  • 同人小游戏之斗罗大陆3
  • 【STM32】IIC
  • es集群详解
  • IDEA导入第三方jar包, 并在Maven中打包该jar包
  • 医疗数字化转型数据中台架构方案(一)
  • vim 简易配置
  • 【视频讲解】SMOTEBoost、RBBoost和RUSBoost不平衡数据集的集成分类酵母数据集、治癌候选药物|数据分享...
  • 【奇某信-注册/登录安全分析报告】
  • 哪些领域最适合采用音视频私有化解决方案?
  • Python 数据分析笔记— Numpy 基本操作
  • 公司新招了个字节拿36K的人,让我见识到了什么才是测试扛把子......
  • 经验笔记:状态机与下推自动机的理解与应用场景
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • 【刷算法】求1+2+3+...+n
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • k8s 面向应用开发者的基础命令
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • ng6--错误信息小结(持续更新)
  • rabbitmq延迟消息示例
  • spring cloud gateway 源码解析(4)跨域问题处理
  • vue-loader 源码解析系列之 selector
  • web标准化(下)
  • 反思总结然后整装待发
  • 高程读书笔记 第六章 面向对象程序设计
  • 构建二叉树进行数值数组的去重及优化
  • 聊聊hikari连接池的leakDetectionThreshold
  • 前端存储 - localStorage
  • 前端路由实现-history
  • 使用Gradle第一次构建Java程序
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • ​iOS安全加固方法及实现
  • #前后端分离# 头条发布系统
  • (11)MSP430F5529 定时器B
  • (3)选择元素——(17)练习(Exercises)
  • (bean配置类的注解开发)学习Spring的第十三天
  • (C语言)二分查找 超详细
  • (el-Transfer)操作(不使用 ts):Element-plus 中 Select 组件动态设置 options 值需求的解决过程
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (数据大屏)(Hadoop)基于SSM框架的学院校友管理系统的设计与实现+文档
  • (转)JAVA中的堆栈
  • (转载)Google Chrome调试JS
  • .NET Core6.0 MVC+layui+SqlSugar 简单增删改查
  • .net 按比例显示图片的缩略图
  • .NET设计模式(7):创建型模式专题总结(Creational Pattern)
  • .NET下ASPX编程的几个小问题
  • .sdf和.msp文件读取
  • /bin/rm: 参数列表过长"的解决办法
  • /ThinkPHP/Library/Think/Storage/Driver/File.class.php  LINE: 48
  • [ HTML + CSS + Javascript ] 复盘尝试制作 2048 小游戏时遇到的问题
  • [ Linux 长征路第二篇] 基本指令head,tail,date,cal,find,grep,zip,tar,bc,unname