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方面的特点。唯物主义辩证思想告诉我们具体问题具体分析~~~所以我们在学会上述方式后,根据项目需求选择合理的解决方式,那会变得非常有趣!

丁。