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 包的同步原语(如互斥锁、通道)来定义内存操作之间的同步关系。
相关推荐
且去填词7 小时前
深入理解 GMP 模型:Go 高并发的基石
开发语言·后端·学习·算法·面试·golang·go
a程序小傲8 小时前
京东Java面试被问:多活数据中心的流量调度和数据同步
java·开发语言·面试·职场和发展·golang·边缘计算
卜锦元10 小时前
EchoChat搭建自己的音视频会议系统01-准备工作
c++·golang·uni-app·node.js·音视频
钟离墨笺11 小时前
Go语言-->interfance{}赋值的陷阱
开发语言·后端·golang
小镇学者12 小时前
【python】python有必要像go或者nodejs那样做多版本切换吗?
开发语言·python·golang
梦想画家12 小时前
深度解析RuleGo框架:核心原理与插件机制实战
golang·规则引擎·rulego
且去填词14 小时前
Go 内存分配器(TCMalloc):栈与堆的分配策略
开发语言·后端·面试·golang
源代码•宸15 小时前
Golang原理剖析(Sync.Map)
数据结构·经验分享·后端·golang·sync.map·readmap·dirtymap
老蒋每日coding15 小时前
Go语言实现 Agent Demo
开发语言·后端·golang
老蒋每日coding16 小时前
Go语言面试题及答案总结(一)
面试·职场和发展·golang