Python多线程多进程和线性执行的比较
来源:互联网 发布:matlab把向量变成矩阵 编辑:程序博客网 时间:2024/05/19 03:28
Thread,Process,Line
在编程人生中,一定会遇到计算时间过长的问题,这个时候提高算法效率就成了必然。有几种方法:算法优化、激发CPUGPU的力量等。
我现在分享关于python多线程多进程的方式和心得,用于激发电脑性能。
Thread
from threading import Thread
任何优化方式都有自己的局限性,python3由于GIL锁机制的问题,在多线程方面对于一大部分情况效果不好。但是对于网络编程方面,多线程却是一个非常好的优化手段!注意上述一句话!!!!!!!!!!!!
多线程使用过程中,打开任务管理器可以看到大量内存被消耗。
使用方式:
temp=Thread(target=function,args)temp.start()
Process
from multiprocessing import Process
多线程是一张桌子好几个人围着坐,多进程则是好多张桌子大家一起坐。显然多进程取决于电脑CPU的性能,也就是核数。使用过程中,打开任务管理器可以看到CPU处于100%状态。
使用方式:
temp=Process(target=function,args)temp.start()
Line
常见的顺序执行代码
比较三者
为了更直观地体会到三者的区别和优势,举个例子,从结果中感受差别。
# 三种测试函数#(1)定义CPU密集计算函数def count(x,y): #使程序完成150万次计算 c=0 while c<500000: c+=1 x+=1 y+=1#(2)定义IO密集的文件读写函数def write(): f=open('test.txt','w') for x in range(500000): f.write("testwrite\n") f.close()def read(): f=open('test.txt','r') f.readlines() f.close()def io(): write() read()#(3)定义网络请求函数#headhead={}head['User-Agent']=r'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36'#urlurl=r"http://www.tieba.com"def http_request(): try: webPage=requests.get(url,head) html=webPage.text return {"context":html} except Exception as e: return {"error":e}
注意理解CPU密集运算、IO密集运算和网络运算的意义,这三者对应了大多数的项目需求。
为了减少代码量,定义测试函数,可以理解为泛型编程的思想。
#(x)定义测试函数def test(testname='Thread',number=10,way=Thread,function=None,args=()): counts=[] t=time.time() #保证默认值 if function==None: def die(): i=1000 return i function=die pass #开启多线程或多进程 for x in range(number): temp=way(target=function,args=args) counts.append(temp) temp.start() #等待算法停止,注意这是比较不好的方式,可以用强制杀死 e=counts.__len__() while e: for th in counts: if not th.is_alive(): counts.remove(th) e=counts.__len__() #打印出算法运行时间 print("%s %s : %s"%(way.__name__,testname,(time.time()-t)))
准备工作完成,开始测试
#(5)测试线性执行IO密集操作、CPU密集操作所需时间、网络请求密集型操作所需时间if __name__=='__main__': #IO密集型操作 t=time.time() for x in range(50): io() print("line IO: %s"%(time.time()-t)) #CPU密集型操作 t=time.time() for x in range(50): count(1,1) print("line CPU: %s"%(time.time()-t)) #网络请求密集型操作 t=time.time() for x in range(50): http_request() print("line http Request: %s"%(time.time()-t)) pass#(6)测试多线程执行IO密集操作、CPU密集操作所需时间、网络请求密集型操作所需时间if __name__=='__main__': test('CPU',50,function=count,way=Thread,args=(1,1)) test('IO',50,function=io,way=Thread) test('http request',50,way=Thread,function=http_request) pass#(7)测试多进程执行IO密集操作、CPU密集操作所需时间、网络请求密集型操作所需时间if __name__=='__main__': test("CPU",50,Process,count,(1,1)) test("IO",50,Process,io) test("http request",50,way=Process,function=http_request) os.remove("test.txt") pass
结果对比
line IO: 19.93960452079773line CPU: 4.375457525253296line http Request: 17.290654182434082Thread IO : 19.752081871032715Thread CPU : 4.031674861907959Thread http request : 1.578291654586792Process IO : 6.2662858963012695Process CPU : 3.2815961837768555Process http request : 8.39150881767273
很显然,可以看到python多线程在网络请求方面的优势,同时多进程在IO、CPU方面的特点。唯物主义辩证思想告诉我们具体问题具体分析~~~所以我们在学会上述方式后,根据项目需求选择合理的解决方式,那会变得非常有趣!
丁。
阅读全文
1 0
- Python多线程多进程和线性执行的比较
- 多进程和多线程的比较
- 多进程和多线程的比较
- 多进程和多线程的比较
- 多进程和多线程的比较
- 多进程和多线程比较
- 多进程和多线程比较
- 多线程 和 多进程 比较
- python 多线程与多进程的简单测试比较
- python的多线程和多进程
- Python :多线程和多进程的选择
- python的多进程和多线程
- python多进程与多线程比较
- python 多线程,多进程执行测试
- 多线程和多进程中几个信号函数的比较
- 关于多线程和多进程的各方面比较
- python 多进程和多线程
- python 多线程和多进程
- 图像标签制作工具之labelImg-windows的安装与使用
- C中strlen和sizeof的区别 详解
- View的工作流程-对MeasureSpec认识
- 基于时间点RMAN恢复
- C# WINFORM判断程序是否运行,且只能运行一个实例
- Python多线程多进程和线性执行的比较
- 关于mysql数据库引擎导致的heibenate的executeUpdate语句不受事务控制
- 深入理解VC
- LeetCode 160 Intersection of Two Linked Lists
- 文章标题
- 关于double与float失精问题解决方案
- android studio ndk环境搭建 和开发
- 读《第一行代码》遇到问题2:Android Device Monitor 文件管理遇到的问题
- Java获得时间戳