Goroutine与依赖管理|青训营

85 阅读3分钟

并发与并行

  • 并发:多线程程序在一个核的cpu上运行
  • 并行:多线程程序在多个核的cpu上运行

进程,协程与线程

  • 进程: 进程是应用程序的启动实例,进程拥有代码和打开的文件资源、数据资源、独立的内存空间。
  • 线程: 线程从属于进程,是程序的实际执行者,一个进程至少包含一个主线程,也可以有更多的子线程,线程拥有自己的栈空间。
    对操作系统而言,线程是最小的执行单元,进程是最小的资源管理单元。无论是进程还是线程,都是由操作系统所管理的。 — 协程: 协程是一种比线程更加轻量级的存在,正如一个进程可以拥有多个线程一样,一个线程可以拥有多个协程。协程不是被操作系统内核所管理的,而是完全由程序所控制,也就是在用户态执行。

Goroutine

在Go语言中,goroutine是实现并发的主要方式。goroutine是由Go运行时环境管理的轻量级线程。

当你在函数调用前加上go关键字,那么这个函数就会在一个新的goroutine中并发执行。这样,函数会立即返回,而函数和调用者可以并发执行。 WechatIMG97.jpg

CSP

是Golang的并发模型。通过通信共享内存 WechatIMG98.jpg

channel 共享内存

通道Channel是 Golang 在语言级别上提供的 goroutine 间的通讯方式,可以使用channel在多个 goroutine 之间传递消息。如果说 goroutine 是 Go 程序并发的执行体,channel 就是它们之间的连接。channel 是可以让一个 goroutine 发送特定值到另一个 goroutine 的通信机制。

  • 创建通道的方法
    • 无缓冲通道 make(chan int)
    • 有缓冲通道 make(chan int,2)
  • 向通道发送接收数据都用<-
ch1 := make(chan int,2)
ch1 <- 10  //将10放入通道
ch1 <- 20
data := <- ch1. //接收数据

如果接收方一直没有接收通道中的数据,发送将受到阻塞

  • 关闭通道 close(ch)

Sync 解决协程间同步问题

  • 同步:在进程中任务未结束时需等待结束才能执行下一个任务
  • 异步:在进程中任务未结束但在等待的过程中可先去执行下一个任务
  • 并发安全lock:不加锁可能产生预期外的数值
  • WaitGroup函数 计数器:开启协程+1;执行结束-1;主协程阻塞知道计数器为0

依赖管理

GOPATH

  • 环境变量$PATH
  • 工作区:
    • bin:项目编译的二进制文件
    • pkg:项目编译的中间产物,加速编译
    • src:项目源码
  • 项目代码直接依赖src下的代码
  • go get直接下载最新版本的包到src目录下
  • 弊端:无法实现package多版本的控制

Go Vendor

  • 项目目录下增加vendor文件,所有依赖包副本放在vendor
  • 弊端:依赖冲突

Go Module

  • 通过go.mod文件管理依赖包版本
  • 通过go get/go mod指令工具管理依赖包

依赖管理三要素

  • 配置文件,描述依赖:go.mod
    • 依赖管理:选择最低的兼容版本
  • 中心仓库管理依赖库: Proxy
    • Proxy 缓存软件内容
    • 变量GOPROXY:GOPROXY="https://proxy1.cn,https://proxy2.cn,direct"服务点URL列表,direct表示源站
  • 本地工具:go get/mod
    • go mod
      • init 初始化,创建go.mod文件
      • download 下载模块到本地缓冲
      • tidy 增加需要的依赖,删除不需要的依赖