第5章 并发编程
Go语言的多线程是基于消息传递的,Go语言将基于CSP模型的并发编程内置到了语言中,其特点就是goroutine之间是共享内存的。
5.1 协程
协程是Go语言特有的一种轻量级线程,实际上,所有的Go语言都是通过goroutine运行的。
5.1.1 核心概念
进程:是指具有一定功能的程序关于某数据集合上的一次执行过程,主要包含程序指令和数据。
线程:进场的子集,是由进程创建的拥有自己控制流和栈的轻量级实体,一个进程至少有一个线程。线程是进程的实际存在。
goroutine:是Go语言并发程序的最小执行单位,可以理解为goroutine运行在操作系统的线程之上,它更为轻量。
5.1.2 goroutine的基本使用
5.1.3 sync.WaitGroup
5.2 通道
通道是Go语言提供的一种在goroutine之间进行数据传输的通信机制。当然,通过channel传递的数据只能是一些指定的类型,这些类型被称为
通道的元素类型。
5.2.1 channel写入数据
5.2.2 channel接收数据
5.2.3 以channel作为函数参数
无缓存的channel的特点就是同步,一个channel写入数据后,如果没有其他goroutine读取,则通道一直阻塞。
5.2.4 缓存channel
5.2.5 select
5.2.6 超时检查
select 可以很方便的完成goroutine的超时检查。超时就是指某个goroutine由于意外退出,导致另一方的goroutine阻塞,从而影响
主goroutine。
当goroutine向某个无缓存通道发送数据,而没有其他goroutine从该无缓存通道接收数据时,发送的goroutine就会阻塞,这种情况叫
goroutine泄露。goroutine泄露是造成超时的最常见原因。
超时检查,技术上使用的是 select + time.After() 来实现的。
5.3 pipeline