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 包的同步原语(如互斥锁、通道)来定义内存操作之间的同步关系。
相关推荐
GoppViper44 分钟前
golang学习笔记24——golang微服务中配置管理问题的深度剖析
笔记·后端·学习·微服务·golang·配置管理
景天科技苑1 小时前
【Go】Go语言中延迟函数、函数数据的类型、匿名函数、闭包等高阶函数用法与应用实战
后端·golang·回调函数·defer·匿名函数·闭包·go函数数据类型
蒙娜丽宁3 小时前
Go语言错误处理详解
ios·golang·go·xcode·go1.19
__AtYou__3 小时前
Golang | Leetcode Golang题解之第412题Fizz Buzz
leetcode·golang·题解
白总Server6 小时前
php语言基本语法
开发语言·ide·后端·golang·rust·github·php
敲代码不忘补水11 小时前
二十种编程语言庆祝中秋节
java·javascript·python·golang·html
Python私教19 小时前
Go语言现代web开发13 方法和接口
前端·数据库·golang
qq_1728055921 小时前
GO Govaluate
开发语言·后端·golang·go
jzpfbpx21 小时前
[go] 命令模式
开发语言·golang·命令模式
Aileen_0v01 天前
【Java宝典】——探索数组的奥秘之旅
java·运维·开发语言·windows·后端·docker·golang