这里卡了好久,是因为 进程、线程以及协程 的关系较为难以用文字表达出来。



什么是协程


要弄清楚什么是协程,我们需要先了解下进程 和 线程 之间的关系,我们从内存的角度来看待该问题,我们都知道,进程是操作系统进行资源分配和调度的基本单位。 并且其程序虚拟内存分布图大致如下


线程是操作系统能够进行调度的最小单位,一个进程至少有一个线程,在上述虚拟内存分布图中,线程会在栈区分配一块区域来存放数据,其他资源则和其他线程共享,例如: 代码段、数据段 以及 堆,其虚拟内存分布大致如下


协程,也称之为用户态线程或则说轻量级线程,顾名思义,协程是在用户态中自己维护的,系统调用则是通过线程去调用的。这样好处为对于内存而言,申请协程,比申请线程内存开销要小得多。



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