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

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 包的同步原语(如互斥锁、通道)来定义内存操作之间的同步关系。

http://www.kler.cn/a/287761.html

相关文章:

  • 【操作系统实验课】Makefile与编译
  • 推荐一个基于协程的C++(lua)游戏服务器
  • vue 模板语法 ( 插值表达式 | 属性绑定 | 双向数据绑定 | 指令 | 按键修饰符 )
  • PCHMI串口接收实验
  • 2024山西省网络建设运维第十八届职业院校技能大赛解析答案(5. nginx 和 tomcat 服务)
  • C++各类函数评点+详解
  • RKNPU2从入门到实践 ---- 【9】使用RKNPU2的C API接口将RKNN模型部署在RK3588开发板上
  • 当敏捷开发遇上AI
  • Go发布自定义包
  • 华为云征文|遥遥领先的华为云Flexus云服务器X它来了~~~~
  • vrrp协议,主备路由器的选举
  • 关于VUE3开发频繁引入ref,reactive,computed等基础函数。
  • mac电脑里面的 磁盘分区,容器,宗卷,宗卷组的理解和使用
  • 【HarmonyOS NEXT开发】鸿蒙开发环境准备,ArkTS基础语法入门
  • 【JavaScript + ES6】前端八股文面试题
  • 笔记:如何使用Process Explorer分析句柄泄露溢出问题
  • 【高校科研前沿】三峡大学黄进副教授等人在环境科学Top期刊JCP发文:人类活动如何在气候变化下影响和降低生态敏感性:以中国长江经济带为例
  • react + ts + material-ui V5版本的table封装
  • css-50 Projects in 50 Days(2)
  • SAP2 - 系统管理课程 System Administration Course
  • redisson异步解锁
  • Tower for Mac Git客户端管理软件
  • 450. 删除二叉搜索树中的节点
  • 跟李沐学AI:序列模型
  • STM32单片机和ARM有什么区别?
  • vue之函数式组件