进程/线程
进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的独立单位
线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。
一个进程可以创建和撤销多个线程,同一个进程中的多个进程可以并发执行
并发/并行
多线程程序在单核心的CPU上运行,称为并发;多线程程序在多核心的CPU上运行,go 1.8后默认设置为最大核数,不需自己设置
协程/线程
协程:独立的栈空间,共享堆空间,调度由用户自己控制,本质上有点类似于用户级线程,这些用户级线程的调度也是自己实现的。
线程:一个线程上可以跑多个协程,协程是轻量级的线程。
Goroutine 介绍
基本概念
goroutine是一种非常轻量级的实现,可在单个进程里执行执行成千上万的并发任务,它是Go语言并发设计的核心。
说到底 goroutine 其实就是线程,但是它比线程更小,十几个 goroutine 可能体现在底层就是五六个线程,而且Go语言内部也实现了 goroutine 之间的内存共享。
使用 go 关键字就可以创建 goroutine,将 go 声明放到一个需调用的函数之前,在相同地址空间调用运行这个函数,这样该函数执行时便会作为一个独立的并发线程,这种线程在Go语言中则被称为 goroutine。
注意
主函数也是一个g程,如果想在主函数中使用其他goroutine,一定要让主函数等待其他goroutine,比如锁,管道,和time包中的sleep函数
通道
通过通信共享内存涉及到另一个概念——通道Channel。
Go可以使用Channel控制子协程,在创建协程时需要创建同样数量的Channel。
每个通道只允许交换指定类型的数据,在Go中使用chan关键字来声明一个通道,使用 close函数来关闭通道。
通过操作符<-来指定通道的方向,实现发送或接收。
通道的创建
make(chan 元素类型, [缓冲大小])
通道分类:
- 无缓冲通道 make(chan int)
- 有缓冲通道 make(chan int, 2)
无缓冲通道也被称为同步通道。
有缓冲通道也是一个生产-消费模型。