本文共 2926 字,大约阅读时间需要 9 分钟。
今天再对比下单线程、多线程、多进程再cpu密集型的情况下的耗时,果然有时候多线程比单线程还慢。。。还是多进程靠谱
import timefrom multiprocessing import Processfrom threading import Thread#装饰器计算函数执行时间def count_time(fun): def warpper(*args): s_time=time.time() fun(*args) e_time=time.time() t_time=e_time-s_time print('%s耗时:%s'%(fun.__name__,t_time)) return warpper#加法操作def add_fun(num): for i in range(50000000): num+=i print(num) return num#单线程加法@count_timedef single_add(num_list): for i in num_list: add_fun(i)#多线程加法@count_timedef thread_add(num_list): thread_list=[] for i in num_list: t=Thread(target=add_fun,args=[i]) t.start() thread_list.append(t) for t in thread_list: t.join()#多进程加法@count_timedef process_add(num_list): process_list=[] for i in num_list: p=Process(target=add_fun,args=[i]) p.start() process_list.append(p) for p in process_list: p.join()if __name__ == '__main__': # num_list=[1,2,3,4,5,6,7,8] num_list = [1, 2, 3, 4] single_add(num_list) thread_add(num_list) process_add(num_list)
上一个执行过程图,明显看出单线程执行是按顺序执行的,每次耗时都差不多,
多线程一个cpu核心负责轮换执行,一个线程执行一小会儿,所以这几个结果基本上是陆续打出,
而多线程情况下,8核CPU跑4个进程,每个进程都相互独立,所以几乎是同一时间打印出结果
#8组数据对比结果:
19999999900000001
19999999900000002 19999999900000003 19999999900000004 19999999900000005 19999999900000006 19999999900000007 19999999900000008 single_add耗时:84.57584691047668 19999999900000001 19999999900000005 19999999900000004 19999999900000008 19999999900000007 19999999900000003 19999999900000002 19999999900000006 thread_add耗时:90.01574563980103 19999999900000008 19999999900000004 19999999900000003 19999999900000007 19999999900000006 19999999900000002 19999999900000001 19999999900000005 process_add耗时:30.791792392730713
在对比一下单线程、多线程、多进程在跑8组数据是的cpu使用率。明显多进程把8个cpu都利用上了,直接100%。
突发奇想想看看在单核cpu的情况下是什么效果,设置单核cpu可以通过msconfig高级引导设置或者直接任务管理器中对某个程序分配单独一个cpu,我给pycharm单独分配了一个cpu
单核cpu的条件下单线程、多线程、多进程整体时间基本在一个数量级了,没有倍数关系了,多进程一般也比多线程耗时时间长,也印证了线程开销更大的理论。
运行效果动图如下,从视觉效果上来看感觉cpu对于进程的切换更平均,虽然不是像多核一下瞬间蹦出所有结果,但是时间间隔非常短,而线程就会陆续输出每个结果。从资源消耗上看,单核下进程确实比线程消耗资源也更多。
单核cpu情况的两组数据:
4个数的耗时:
1249999975000001
1249999975000002 1249999975000003 1249999975000004 single_add耗时:9.950999975204468 1249999975000004 1249999975000001 1249999975000002 1249999975000003 thread_add耗时:8.997999906539917 1249999975000001 1249999975000002 1249999975000003 1249999975000004 process_add耗时:9.460000038146973
8个数的耗时:
1249999975000001
1249999975000002 1249999975000003 1249999975000004 1249999975000005 1249999975000006 1249999975000007 1249999975000008 single_add耗时:19.502000093460083 1249999975000001 1249999975000006 1249999975000002 1249999975000008 1249999975000005 1249999975000004 1249999975000003 1249999975000007 thread_add耗时:18.31500005722046 1249999975000001 1249999975000003 1249999975000004 1249999975000007 1249999975000006 1249999975000002 1249999975000008 1249999975000005 process_add耗时:18.957000017166138
转载地址:http://ccxws.baihongyu.com/