本篇主要讲的是多线程并发优缺点,包括执行IO密集型任务和计算型密集任务时分别使用串行和并发来看CPU的使用效率。希望感兴趣的小伙伴可以坚持看下去同时欢迎提出宝贵的意见让我们一起进步!
01:问题引入
为何需要多线程?
要把100M数据写入磁盘,CPU计算的时间只需要0.01s,可是磁盘接受这100M数据却需要10s。
怎么办呢?有以下两种办法
第一种办法是CPU等着,也就是程序暂停执行后续代码,直到磁盘写入数据完成再继续往下执行
第二种办法是CPU告诉磁盘:“您老人家慢慢写,我去做别的事情了”
02:IO型密集任务
1)概述:指磁盘IO、网络IO占主要的任务,计算量很小。
2)特点:有大量的等待时间。CPU消耗很少,任务的大部分时间都在等待IO操作完成。
3)注意:在Python中可以利用sleep达到IO密集型任务的目的。
03:串行执行IO型密集任务
import time,threading
begin_time=time.time()
def foo(something):
print(something)
time.sleep(2)
#串行执行IO型密集任务
foo('磁盘接收100M数据')
foo('CPU执行其他任务!')
end_time=time.time()
#打印主线程运行时间
print('共计消耗时长为:',end_time-begin_time)#4s
04:多线程并发执行IO型密集任务
import time,threading
begin_time=time.time()
def foo(something):
print(something)
time.sleep(2)
#多线程并发执行IO型密集任务
t1=threading.Thread(target=foo,args=('磁盘接收100M数据',))
t2=threading.Thread(target=foo,args=('CPU执行其他任务!',))
t1.start()
t2.start()
t1.join()
t2.join()
end_time=time.time()
print('共计消耗时长为:',end_time-begin_time)#2s
05:多进程并发执行IO型密集任务
import time
from multiprocessing import Process
begin_time=time.time()
def foo(something):
print(something)
time.sleep(2)
#多进程并发执行IO型密集任务
if __name__ == '__main__':
t1=Process(target=foo,args=('磁盘接收100M数据',))
t2=Process(target=foo,args=('CPU执行其他任务!',))
t1.start()
t2.start()
t1.join()
t2.join()
end_time=time.time()
print('共计消耗时长为:',end_time-begin_time)#2.20212s
06:计算型密集任务
1)概述:指CPU计算占主要的任务,CPU一直处于满负荷状态。
2)特点:一直在执行没有等待时间。要进行大量的计算,消耗CPU资源。
07:串行执行计算型密集任务
import time,threading
begin_time=time.time()
def bar():
num=0
for i in range(100000000):
num+=1
#串行执行计算型密集任务
bar()
bar()
end_time=time.time()
print('共计消耗时长为:',end_time-begin_time)#14.5928s
08:多线程并发执行计算型密集任务
import time,threading
begin_time=time.time()
def bar():
num=0
for i in range(100000000):
num+=1
#多线程并发执行计算型密集任务
t1=threading.Thread(target=bar)
t2=threading.Thread(target=bar)
t1.start()
t2.start()
t1.join()
t2.join()
end_time=time.time()
print('共计消耗时长为:',end_time-begin_time)#14.3198s
09:多进程并发执行计算型密集任务
import time
from multiprocessing import Process
begin_time=time.time()
def bar():
num=0
for i in range(100000000):
num+=1
#多进程并发执行计算型密集任务
if __name__ == '__main__':
t1=Process(target=bar)
t2=Process(target=bar)
t1.start()
t2.start()
t1.join()
t2.join()
end_time=time.time()
print('共计消耗时长为:',end_time-begin_time)#9.6735s
10:总结
1)多线程并发优点:在执行IO密集型任务时,某个任务阻塞的时候CPU会切换到其他任务就大大提高了CPU的使用效率。
2)多线程并发缺点:在执行计算密集型任务时,CPU一直在计算没有休息。因此python多线程并发并不能显著提高效率,但是使用多进程执行效率有所提升。
网友评论