python进程、线程和协程(一)

前言:众所周知,任何一门编程语言都绕不开一个问题,那就是并发编程

并发是一种计算机能并行运行多个程序或并行运行一个程序中多个部分的能力。
现代的PC都有多个CPU或一个CPU中有多个核。是否能合理运用多核的能力将成为一个大规模应用程序的关键。
如果程序中一个耗时的任务能以异步或并行的方式运行,那么整个程序的吞吐量和可交互性将大大改善。
然而本质上来说真正的并行执行多任务只能在多核CPU上实现,但是由于实际上任务数量远远多于CPU的核心数量,所以,操作系统也会自动把很多任务轮流调度到每个核心上执行。
在python这门语言中,对于并发的支持可以通过多进程Process多线程Thread多协程Coroutine来实现。

python进程、线程、协程

这里来说明一下python的线程和协程。
由于python语言机制的问题,即在python的设计之初加入了GIL(线程全局锁),导致python程序在运行中的某一时刻只能有一个线程来执行。从而就造成了python程序不能真正意义上做到多线程,在这种情况下,python引入了协程这个概念。
协程:又称微线程,纤程。英文名Coroutine。协程的本质还是线程,python通过多协程,异步IO来实现程序提速,即在每个线程下做异步IO的操作。
这些会在后文做出详细说明。
接下来会讨论一个问题:python编程过程中如何选择使用多线程,还是多进程,或者多协程?
要弄清楚这个问题,要先弄清楚CPU密集型任务和IO密集型任务。

CPU密集型任务&IO密集型任务

CPU密集型任务的特点是要进行大量的计算,消耗CPU资源。这种CPU密集型任务虽然也可以用多任务完成,但是任务越多,花在任务切换的时间就越多,CPU执行任务的效率就越低,所以,要最高效地利用CPU,CPU密集型任务同时进行的数量应当等于CPU的核心数。
例如:压缩解压缩、加密解密、正则表达式搜索、圆周率计算、视频高清解码等。

IO密集型任务的特点是CPU消耗很少,任务的大部分时间都在等待IO操作完成(因为IO的速度远远低于CPU和内存的速度)。对于IO密集型任务,任务越多,CPU效率越高,但也有一个限度。
例如:文件处理、网络爬虫、数据库读写、Web应用等。

python 多进程、多线程、多协程对比

级联关系:一个进程可以有多个线程,但是至少要有一个线程;一个线程可以有多个协程,可以没有协程

  • 多进程Process(multiprocessing)
    优点:可以利用多核CPU
    缺点:占用资源最多、可启动数目比线程少
    适用于:CPU密集型任务

  • 多线程Thread(threading)
    优点:相比进程,更轻量级、占用资源少
    缺点:相比进程,多线程只能并发执行,不能利用多核CPU;相比协程,启动数目有限,占用内存资源,有线程切换的开销
    适用于:IO密集型任务、同时运行的任务数目要求不多

  • 多协程Coroutine(asyncio)
    优点:内存开销最少、可启动数目最多
    缺点:支持的库有限、代码实现复杂
    适用于:IO密集型任务、需要超多任务运行、但有现成库支持

如何选择多进程、多线程、多携程

python进程、线程和协程(一)_第1张图片

你可能感兴趣的:(python,python,多线程,多进程)