Python多线程多进程和线性执行的比较

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

丁。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值