把机器的一个核看成一条路,多核机器拥有多条路。
单核机器,只有一条路。
车子比作任务。
并发,也按字面理解,同一时刻出发,但是车子有快有慢,N个车子参差不齐地在一个道上跑(单核),在道上的某一处,只能有一辆车,其他车在前或者在后。一辆车呼啸而过之后,紧接着是下一辆。和单核在处理多个任务时不停切换类似。
并行,我们就按字面意思理解,比如N辆车并行,那肯定是同一时刻,这N辆车在并排跑,齐头并进(N个任务在同时被处理)。
N量车子并行跑,由于量可能会很大,因此不可能是只有1条道,N >= 2, 所以这点我们可以确定并行是建立在多条路(多核)的基础上。
并行,如上图示,一条红线强行脑补成一条路。后排三头驴就是并行
并发,如上图。
通常所说的并发编程,也就是说它允许多个任务同时执行,但实际上并不一定在同一时刻被执行。在单核处理器上,通过多线程共享CPU时间片串行执行(并发非并行)。而并行则依赖于多核处理器等物理资源,让多个任务可以实现并行执行(并发且并行)。
多线程或多进程是并行的基本条件,但单线程也可以用协程(coroutine)做到并发。简单将Goroutine归纳为协程并不合适,因为它运行时会创建多个线程来执行并发任务,且任务单元可被调度到其它线程执行。这更像是多线程和协程的结合体,能最大限度提升执行效率,发挥多核处理器能力。