这里卡了好久,是因为 进程、线程以及协程 的关系较为难以用文字表达出来。
什么是协程
要弄清楚什么是协程,我们需要先了解下进程 和 线程 之间的关系,我们从内存的角度来看待该问题,我们都知道,进程是操作系统进行资源分配和调度的基本单位。 并且其程序虚拟内存分布图大致如下
线程是操作系统能够进行调度的最小单位,一个进程至少有一个线程,在上述虚拟内存分布图中,线程会在栈区分配一块区域来存放数据,其他资源则和其他线程共享,例如: 代码段、数据段 以及 堆,其虚拟内存分布大致如下
协程,也称之为用户态线程或则说轻量级线程,顾名思义,协程是在用户态中自己维护的,系统调用则是通过线程去调用的。这样好处为对于内存而言,申请协程,比申请线程内存开销要小得多。
go 协程
开启协程
golanggo我们执行程序后,输出为
gomain那么,我们是否有方法等待协程结束呢? 有的
等待协程执行完毕
sync.WaitGroup- (wg *WaitGroup) Add(delta int)
deltawaitgroup- func (wg *WaitGroup) Done()
等同于 (wg *WaitGroup) Add(-1)
- func (wg *WaitGroup) Wait()
waitgroup我们来写一个等待协程执行完毕的例子
wg.Add(1)我们执行下
协程序小案例
shellshell其具体逻辑为:
go具体的可以查看详细代码
总结
gomainsync.WaitGroupgo