开始正文之前。我们先来注意这样几点:
1、什么是进程?
正在执行的一个程序或者一个任务,负责执行任务的是CPU。进程是用来把资源集中到一起的,简而言之,进程是资源单位,或者说资源集合。
2、什么是线程?
线程是CPU上的执行单位。同一个进程内的多个线程共享该进程内的地址资源。创建线程的开销远小于创建进程的开销。
3、进程和线程的区别
① 每启动一个进程,这个进程内至少得有一个线程。
② 进程本身只是一个资源单位,并不是真正执行,进程内的线程才是执行单位。
③ 一个进程内可以有多个线程,且进程在内存中相互隔离,而同一个进程内的线程是共享资源的,各线程之间地位是平等的。
④ 进程更消耗资源,而线程开销小,是在已有的进程内占用。
正文开始
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
看了以上这些,大家肯定认为多线程是优于多进程的,那么多线程任何时候都优于多进程吗?
我们慢慢接着看,用实例说话。
计算机程序进行的操作粗略可分为计算密集型和IO(输入输出)密集型两种。我们通过分别开启多进程和多线程
测试计算机的运行时间,以此来判断多进程和多线程的效率高低,即优劣之分。
第一种:计算密集型
#!/user/bin/env python3 # -*- coding:utf-8 -*- # write by congcong from multiprocessing import Process from threading import Thread import time import os def task(): res = 10 for i in range(10000000): res *= i if __name__ == "__main__": t_list = [] print(os.cpu_count()) # 显示本机cpu核心数--》4 start_time = time.time() # 程序开始时刻 for i in range(20): p = Process(target=task) # 开启多个线程 t = Thread(target=task) # 开启多个线程 #t_list.append(p) # 添加进程到列表 t_list.append(t) # 添加线程到列表 for t in t_list: #依次启动进程\线程 t.start() for t in t_list: # 使用join方法保证每个进程\线程都执行完毕 t.join() stop_time = time.time() # 程序结束时刻 print('程序运行总时长:%s'%(stop_time-start_time))
猜一猜,哪一个的效率更高,是多进程?还是多线程?谜底在下方...
#多进程下程序运行总时长:8.04701852798462 #多线程下程序运行总时长:11.769368171691895
为什么如此呢?原因是什么?我们稍后再议,先接着比较第二种情况(IO密集型)时多进程和多线程的表现。
第二种情况:IO密集型
#!/usr/bin/env python3 #-*- coding:utf-8 -*- # write by congcong from multiprocessing import Process from threading import Thread import time import os def task(): time.sleep(2) # 模拟IO操作 if __name__== "__main__": t_list = [] print(os.cpu_count()) # 显示本机cpu核心数--》4 start_time = time.time() # 程序开始时刻 for i in range(100): #p = Process(target=task) # 开启多个进程 t = Thread(target=task) # 开启多个线程 #t_list.append(p) # 添加进程到列表 t_list.append(t) # 添加线程到列表 for t in t_list: # 依次启动进程\线程 t.start() for t in t_list: # 使用join方法保证每个进程\线程都执行完毕 t.join() stop_time = time.time() print('程序运行总时长:%s'%(stop_time-start_time))
大家再猜一下,这时候两者的效率有何不同?谜底见下方:
# 开启多个进程 程序运行总时长--8.04701852798462 # 开启多个线程 程序运行总时长--2.011910915374756
耐心看到这里的同学大概已经明白了,多进程和多线程各有优劣,没有谁能无敌天下,
要分不同的情况分析才合理,详细的总结如下:
针对第一种情况(计算密集型),因为Python有了GIL的存在,同一时刻同一进程中只有一个线程被执行。我测试用的电脑CPU是4核心,所以所以多进程能够利用多核的优势。