引言
本文是并发编程的系列的最后一篇, 将通过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的简单定义与使用.