这是我参与「第三届青训营 -后端场」笔记创作活动的的第2篇笔记
并发编程
并发、并行
- 并发(concurrency):把任务在不同的时间点交给处理器进行处理。在同一时间点,任务并不会同时运行。
- 并行(parallelism):把每一个任务分配给每一个处理器独立完成。在同一时间点,任务一定是同时运行。
并发不是并行。并行是让不同的代码片段同时在不同的物理处理器上执行。并行的关键是同时做很多事情,而并发是指同时管理很多事情,这些事情可能只做了一半就被暂停去做别的事情了。在很多情况下,并发的效果比并行好。
协程
- 进程是资源分配的单位
- 线程是操作系统调度的单位
- 进程切换需要的资源很最大,效率很低
- 线程切换需要的资源一般,效率一般
- 协程切换任务资源很小,效率高
- 多进程、多线程根据cpu核数不一样可能是并行的 也可能是并发的。协程的本质就是使用当前进程在不同的函数代码中切换执行,可以理解为并行。 协程是一个用户层面的概念,不同协程的模型实现可能是单线程,也可能是多线程。
在go语言中,协程被认为是轻量级的线程, 和线程不同的是,操作系统内核 感知不到协程的存在, 协程的管理依赖于Go语言运行时自身提供的调度器 同时Go语言中的协程是从属于某一个线程的.
goroutine
goroutines 意味着并行(或者可以以并行的方式部署),通过通道来通信;goroutines 比 coroutines 更强大,也很容易从 coroutines 的逻辑复用到 goroutines;goroutine 间使用 channel 通信。
依赖管理
- 配置文件,描述依赖 go.mod
- 中心仓库管理依赖库 Proxy
- 本地工具 go get/mod
测试
测试是避免事故的最后一道屏障 回归测试-集成测试-单元测试
单元测试
- 一般覆盖率:50%~60%,较高覆盖率80%+。
- 测试分支相互独立、全面覆盖。
- 测试单元粒度足够小,函数单一职责。
Mock测试
monkey : github.com/bouk/monkey
基准测试
- 优化代码,需要对当前代码分析
- 内置的测试框架提供了基准测试的能力
总结和思考
目前提供了很多好用的依赖包或是工具,使得Go语言开发变得更见简单