进程:一个进程就是一个正在运行的程序,它是计CPU分配资源的最小单位。每个进程都有自己独立的内存空间。能同时执行的进程数最多不超过内核数,也就是每个内核同一时刻只能执行一个进程。那么多进程就是能【同时】运行多个进程(比如同时听音乐和写代码),这里的【同时】可以指CPU通过极快地在进程间来回切换来实现,所以即使是单核CPU也能运行多进程。
线程:线程是CPU执行的基本单元。线程存在于进程中。一个进程中至少有一个线程,多个线程能够共享进程的大部分资源,并参与CPU的调度。意味着它能够在进程间进行切换,实现【并发】,这就是多线程。多线程(比如看视频时既能看到画面也能听到声音)是为了同步完成多项任务、提高资源利用率,从而提高系统的效率。
协程:协程也可以称作微线程,是单一线程。它通过在内部多个子程序(函数)的中断和返回继续执行来实现多任务。比如在一个线程中执行任务A的过程中,可以随时中断,去执行B任务,B也可能在执行过程中中断再去执行A。协程的调度不来自于CPU,而是完全来自于用户控制(可以理解为用代码控制流程)。它的切换不是线程切换,而是内部子程序的切换。只要线程越多,协程的性能优势就越明显。协程不需要多线程的锁机制,只需要判断状态即可。不过协程本身无法利用多核CPU,因为它是单一线程。
它们之间的比较:
多进程:占用内存多;通信复杂、数据同步简单;各进程相互独立;创建、销毁及切换复杂,速度慢多线程:占用内存少;通信简单、数据同步复杂;一个线程挂掉会导致整个进程挂掉;创建、销毁及切换简单,速度快多协程:占用内存极少;共享单线程的代码段、公有数据;切换的开销最小、速度最快(不用切换到内核态)
Python的多进程可由 multiprocessing 库实现;多线程可由 threading 库实现;协程可由 gevent 、asyncio 或 yield 实现。