引言
本文是并发编程的系列的最后一篇, 将通过Demo
的方式, 尽可能的展示之前提到的技巧, 顺便做一个总结吧; 实现一个Demo
: 双协程交替打印.
参考: 深入学习 golang 中 map 底层实现, Go Map底层实现原理
Map
是最见的数据结构, 其是无序键值对(key: value
)的集合.本文将结合源码与图示对Go Map
进行解读, 期望使得读者可以对Map
数据结构&操作流程有一个清晰理解;
源码路径: go/src/runtime/map.go
, 版本: go1.21.5
, 环境: linux/amd64
参考: Go Concurrency Patterns: Context - The Go Programming Language
本文将简单介绍下context pkg
内的关键类型与函数, 随后通过两个用例的方式展示context
在并发编程中的使用场景;
在Server
端一次请求的发生, 往往需要启动新的goroutine
, 例如用来请求数据库或RPC
. 这就提出了一些合理的需求: 有时需要对goroutine
进行生命周期的控制, 例如超过了预期时间则视为请求失败, 应当销毁相关goroutine
; 有时需要传递请求相关的内容, 例如权限信息, Trace-ID
等.
基于此Google
提出了context
包, 在并发场景下实现请求生命周期控制;
参考: Go Concurrency Patterns: Pipelines and cancellation - The Go Programming Language
Pipeline
是并发编程之中的官方推荐范式. 本文将通过Demo
形式介绍一个并发编程范式: pipeline
, 与相关适配模式: fan-in, fan-out, cancellation
.
Go
并发原语使得编码人员可以轻易的构建数据流管道pipeline
从而更有效的利用I/O, CPU
等资源.
sync
包是Go
标准包之一, 其使用场景可以分为三种:
Mutex
: 共享锁, 读写锁用于共享资源的互斥使用;WaitGroup
: goroutine
同步控制;Once
: 全局唯一初始化代码.在并发编程过程中, 涉及到前两种使用场景. 本文会简单采用Demo
方式介绍Mutex, WaitGroup
的使用.
Select
就是Channel
的Switch
. Select
具备一系列的Case
分支和一个默认default
分支, 每一个case
对应于一个channel
操作(send/receive
). select
在多case
场景下会一直等待, 直到某个case
操作完成, 就会执行case
内对应的语句.
在Go
中goroutine
的同步机制主要包括channel
与sync
. 本文介绍channel
的简单定义与使用.