Go并发编程一直是大家津津乐道的一个技术点,其goroutines和channel的灵活使用使得并发更具效率。
从个人理解来看,并发,指的是多个事情,在同一时间段内同时发生了。并行,指的是多个事情,在同一时间点上同时发生了。并发的多个任务之间是互相抢占资源的,并行的多个任务之间是不互相抢占资源的。只有在多CPU的情况中,才会发生并行。进程是程序的一次执行过程,线程则是进程的一个执行单元,是进程内部调度实体,是比进程更小的独立运行的基本单位。线程也被称为轻量级进程。无论是进程还是线程,都是可以并发的,只不过进程并发消耗资源大,需要频繁并发的话,选择线程更优。而在线程上,协程的使用则更加提高资源利用。协程,是一种比线程更加轻量级的存在。一个线程也可以拥有多个协程。Go对协程的开启很简单,直接使用go xxx即可开启一个协程。 另外,协程是基于主函数这个线程的。练手的时候会发现,一旦主函数执行完成,线程关闭,基于主函数这个线程上的协程也就关闭了。要想让主线程等待各协程执行完全后再关闭,可以使用time.Sleep(),但个人感觉这个不好控制具体填多少时间合适,容易浪费太多时间去等待,影响程序效率。为了更好地解决这个问题,Go提供的标准库函数里面有Sync.WaitGroup(),通过计数开启的协程和执行完的协程数,可以更优雅地实现主线程和协程的运行关系。