一、进程、线程、协程的概念
1、进程:
教科书上最经典的一句话解释:——进程是资源分配的最小单位
实质上的理解:——先加载程序A的上下文,然后开始执行A,保存程序A的上下文,调入下一个要执行的程序B的程序上下文,然后开始执行B,保存程序B的上下文。进程的生命周期有调入,执行,保存的过程。
2、线程:
教科书上最经典的一句话解释:——线程是CPU调度的最小单位
实质上理解:——一个应用程序的执行可能有多个分支和多个程序段,就好比要实现程序A,实际分成 a,b,c等多个块;这里的a,b,c就是线程,也就是说线程是共享了进程的上下文环境,单核任务中划分更为细小的CPU时间段
3、协程:
教科书上最经典的一句话解释:——协程是线程的一种表现形式。
实质上理解:——协程又称微线程。在单线程上执行的多个任务,用函数切换,开销极小。
深入理解:子程序,或者称为函数,在所有语言中都是层级调用,比如A调用B,B在执行过程中又调用了C,C执行完毕返回,B执行完毕返回,最后是A执行完毕。所以子程序调用是通过栈实现的,一个线程就是执行一个子程序。子程序调用总是一个入口,一次返回,调用顺序是明确的。而协程的调用和子程序不同。协程看上去也是子程序,但执行过程中,在子程序内部可中断,然后转而执行别的子程序,在适当的时候再返回来接着执行。注意,在一个子程序中中断,去执行其他子程序,不是函数调用,有点类似CPU的中断
二、进程、线程、协程的区别
1、多进程/多线程
共同点 :表示可以同时执行多个任务,进程和线程的调度是由操作系统自动完成。
区别:
进程:每个进程都有自己独立的内存空间,不同进程之间的内存空间不共享。进程之间的通信有操作系统传递,导致通讯效率低,切换开销大。
线程:一个进程可以有多个线程,所有线程共享进程的内存空间,通讯效率高,切换开销小。共享意味着竞争,导致数据不安全,为了保护内存空间的数据安全,引入"互斥锁"。一个线程在访问内存空间的时候,其他线程不允许访问,必须等待之前的线程访问结束,才能使用这个内存空间。
互斥锁:一种安全有序的让多个线程访问内存空间的机制。
python的多线程:由于有GIL锁的存在,一个线程需要执行任务,必须获取GIL,好处:直接杜绝了多个线程访问内存空间的安全问题。坏处:Python的多线程不是真正多线程,不能充分利用多核CPU的资源。
2、多线程和协程之间的共同点和区别:
共同点:
都是并发操作,多线程同一时间点只能有一个线程在执行,协程同一时间点只能有一个任务在执行;
不同点:
多线程,是在I/O阻塞时通过切换线程来达到并发的效果,在什么情况下做线程切换是由操作系统来决定的,开发者不用操心,但会造成竞争条件。协程是用函数切换,开销极小。不通过操作系统调度,没有进程、线程的切换开销。
三、应用场景
如果是 I/O 密集型,且 I/O 请求比较快的话,使用多线程。
如果是 计算 密集型,考虑可以使用多核 CPU,使用多进程。