01.13 多进程 VS 多线程:Python执行效率如何?IO和CPU告诉你

大家在学习一门计算机语言,不可避免的要考虑到运行效率问题,例如爬取多个网页时,是否可以利用计算机多核,实现程序并发运行,再比如内存数据交换、文件的读写、或者网络通信,总会出现阻塞IO,是否可以通过增加进程,将阻塞状态变成非阻塞状态。

此时,多任务编程重要性就显现出来了,多任务编程就是充分利用计算机资源,同时运行多个任务,提高程序整体的运行效率,实现手段就是大家熟知的多进程和多线程操作,也就是所谓的并行和并发,并行就是多个计算机核心在同时处理多个任务,这时多个任务之间是并行关系,所占资源会比较多;而并发是指同时运行多个任务,一个内核在多个任务间不断切换,达到多个任务都会被执行的处理效果,此时多个任务间是并发关系。

解释了并行和并发,就不难理解进程和线程了,进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础,而一个进程包含多个线程,线程也是一种多任务编程方式,可以使用计算机的多核资源,是计算机内核使用的最小单位,那python中的多进程和多线程谁的效率更高呢?小编用IO密集和CPU密集两种状态对单进程、多进程、多线程进行比较测试,下面直接撂代码。

首先是测试对象:IO密集和CPU密集实例,这里以200万次的“hello world”读写操作作为IO密集测试样例,以700万次累加操作作为CPU密集测试样例:

多进程 VS 多线程:Python执行效率如何?IO和CPU告诉你

IO密集和CPU密集测试样例

下面先进行单进程操作:

多进程 VS 多线程:Python执行效率如何?IO和CPU告诉你

单进程操作(IO密集和CPU密集)

然后是多进程操作:

多进程 VS 多线程:Python执行效率如何?IO和CPU告诉你

多进程操作(IO密集)

多进程 VS 多线程:Python执行效率如何?IO和CPU告诉你

多进程操作(CPU密集)

最后是多线程操作:

多进程 VS 多线程:Python执行效率如何?IO和CPU告诉你

多线程操作(IO密集)

多进程 VS 多线程:Python执行效率如何?IO和CPU告诉你

多线程操作(CPU密集)

运行结果汇总如下:

多进程 VS 多线程:Python执行效率如何?IO和CPU告诉你

单进程、多进程、多线程运行结果

根据结果可以看出,分别测试单进程、多进程、多线程执行相同的IO操作和cpu操作的时间,cpu消耗中:单进程为7.44s,多进程为4.04s,多线程为7.90s;在io消耗中,单进程为6.19s,多进程为2.94s,多线程为5.74s。无论是CPU(计算)密集型程序或是IO密集型程序,多进程并发优于多线程并发,并且在CPU(计算)密集型程序中,多线程比单进程效率还慢,在IO密集型程序中,多线程优势也不是很明显,究其原因,都绕不开Python的全局解释器锁的问题,即GIL问题。

但python的多线程并不是一无是处,对于高延迟和多阻塞的IO事件,可以像非阻塞IO一样,通过属性和超时检测发送错误,再通过捕捉错误跳过该阻塞IO,先并发其他IO事件,可以节省效率,在这方面python多线程的创建删除消耗的资源远小于多进程,大概是进程的1/20,因此到底选用多进程还是多线程时,小编为大家总结了以下经验:如果一个进程中并发任务比较多,比较简单,适合使用多线程;如果数据程序比较复杂,特别是可能多个任务通信比较多的时候,要考虑到使用线程同步互斥的复杂性;如果多个任务存在明显差异,和功能分离的时候,可以考虑使用多进程。

受制于水平的有限,这里只从IO密集和CPU密集两个方面对单进程、多进程和多线程进行了对比。需要交流和切磋的读者朋友,请在评论区积极留言,欢迎关注头条号:杜哥说python。


分享到:


相關文章: