Go高并发 | 青训营笔记

231 阅读3分钟

这是我参与 [第三届青训营 -后端场]笔记创作活动的第3篇笔记 通信实现共享内存(channel)

共享内存实现通信(临界区)

线程

协程

协程与通道通信

并发安全(共享内存实现通信) 数据映太

权限控制

sleep(阻塞控制)

等待队列

add

done

wait

sync

lock

withgroup

依赖管理三要素

配置文件,描述依赖-> go.mod

module 版本号

1.依赖配置-go.mod

模块路径:标识模块 定位仓库

标识原生库版本号: go的原生库

单元依赖:定位仓库的某一个版本,某一次提交

2.依赖配置-version

语义化版本 大(之间可以不兼容):中(新增函数,功能):小(代码,bug修复)

V1.3.0

V2.3.0

基于commit伪版本

语义化版本+时间戳+hash校验码

3.依赖配置-indirect

A依赖B,B依赖C A直接依赖B(不加) A间接依赖C(加indirect)

4.依赖配置-incompatible

主版本2+模块会在模块路径加/vN后缀

没有go.mod文件(老模块)且主版本2+的依赖,会+incompatible

题目:选择最低的兼容版本

中心仓库如何管理依赖库 proxy

5.依赖分发-回源(第三方源站下载)

直接从第三方仓库拉代码

  • 作者改版本

proxy:缓存内容

  • 从 go proxy拉取代码

goproxy:url列表

本地工具 go get/mod

测试

覆盖率

回归测试

手动到场景(人工)

集成测试

自动化测试(某个接口,功能维度)

单元测试(函数,模块...)

开发者对单独模块做测试

  • 保证质量(增加新模块)
  • 提升效率(找bug效率)

单元测试-规则

Test开头

单元测试-例子

单元测试-运行

go test ...

单元测试-代码覆盖率

加上 --cover 可选项

函数行数的执行占比(3条,用两条 覆盖率为66.7%)

函数小利于单元测试覆盖度提升

单元测试-依赖(依赖组件很复杂,不可能单一函数)

目标:

幂等:每次结果一样

稳定:单元测试相互隔离(任何时间,函数独立运行)

直接测试不稳定,无法保证每次结果一样

mock机制

单元测试-文件处理(外部依赖)

文件被篡改后,无法测试.(mock处理,让测试不依赖于文件)

基准测试-例子(性能分析)

服务器负载均衡场景

随机选择服务器(rand.Intn(10))

基准测试-运行

Benchmark开头

全局锁 降低 多协程的(性能)执行速度? 比单协程低?

b.RunParallel

基准测试-优化(fastrand())

项目实践

需求设计

展示文字

展示回帖列表

实体

topic结构体

标题

文字

id

创建时间

回帖列表

帖子id

主题id

回帖内容

回帖时间

两个实体一对多

分层结构

数据层:处理数据(向上提供数据)

透明:上一层无需关心底层实现

逻辑层:提供实体

视图层:json格式化结果.提供给接口

1:27:40

代码开发

测试运行

实战

Repository

初始化话题数据索引

初始化回帖数据索引

实现查询(sync.Once 单例模式)