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)定义网络请求函数
#head
head={}
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'
#url
url=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.93960452079773
line CPU: 4.375457525253296
line http Request: 17.290654182434082
Thread IO : 19.752081871032715
Thread CPU : 4.031674861907959
Thread http request : 1.578291654586792
Process IO : 6.2662858963012695
Process CPU : 3.2815961837768555
Process http request : 8.39150881767273
很显然,可以看到python多线程在网络请求方面的优势,同时多进程在IO、CPU方面的特点。唯物主义辩证思想告诉我们具体问题具体分析~~~所以我们在学会上述方式后,根据项目需求选择合理的解决方式,那会变得非常有趣!
丁。