多任务
CPU承担了所有的计算任务。一个CPU在一个时间切片里只能运行一个程序。当我们想同时运行多于一个程序的时候,就是多任务,例如同时运行微信,QQ,浏览器等等。多任务的目的是提升程序的执行效率,更充分利用CPU的资源。
- 并行
当任务数≤ CPU核数时,每一个任务都有对应的CPU来处理执行,多个务同时执行,互不抢占CPU资源,可以同时进行,这种方式我们称之为并行(Parallel)。
- 并发
当任务数≥ CPU时,多个任务在执行,则每个CPU不可能真正同时进行一个以上的任务,多个任务只能把CPU运行时间划分成若干个时间段,在一个时间段的任务代码运行时,其它任务处于挂起状态。.这种方式我们称之为并发(Concurrent)。实际上总有一些任务不在执行,因为切换任务的速度相当快,看上去像一起执行而已。
Python中的进程、线程、协程
- 进程(multiprocessing模块)
进程是系统进行资源分配和调度的独立单位。我们用流水线来进行解释进程:假如有9000个零件需要加工,这9000个零件加工就代表9000个任务,即多任务。我们现在有3条流水线,这3条流水线就代表3个进程,每个进程中有1个员工在加工零件。3个进程之间互不影响,可以同时工作。
- 线程(threading模块)
线程是进程的实体,是CPU调度和分派的基本单位。线程是属于进程的,线程运行在进程空间内。我们用流水线来进行解释线程:假如有9000个零件需要加工,这9000个零件加工就代表9000个任务,即多任务。我们现在有1条流水线,这1条流水线就代表1个进程,这1个进程中有3个员工在加工零件。那么3个员工就代表3个线程,线程之间互不影响,可以同时工作。
- 协程(gevent,属于第三方模块,需要下载安装)
pip install gevent
协程也是线程,称微线程,是比线程更小的执行单元,解决的是IO的操作。协程最大的优势就是协程极高的执行效率。因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显。协程也存在着切换,这种切换是由我们用户来控制的。我们用流水线来进行解释线程:假如有9000个零件需要加工,这9000个零件加工就代表9000个任务,即多任务。我们现在有1条流水线,这1条流水线就代表1个进程,这1个进程中有1个员工在加工零件。当第1个零件加工的时候,在第1个零件加工等待期间(程序挂起,等待),飞速切换到第2个零件处加工,在第2个零件加工等待期间,飞速切换到第3个零件处加工,待第1个零件加工等待结束前切回第1个零件处,如此往复。协程之间不同时工作。
- 区别
- 一个程序至少有一个进程,一个进程至少有一个线程;
- 线程的划分尺度小于进程(资源比进程少),使得多线程程序的并发性高;
- 进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率;
- 线程不能够独立执行,必须依存在进程中;
- 优缺点:
线程执行开销小,但不利于资源的管理和保护;而进程正相反;当我们要完成的任务有耗时任务,属于IO密集型任务时,我们使用协程来执行任务会节省很多的资源,并且可以极大的利用到系统的资源。