进程池、线程池、单线程 运行时间实验
"""
进程池、线程池、单线程、
CPU密集型、IO密集型、的速度对比
CPU密集型:需要CPU进行复杂运算的情况
IO密集型:需要频繁进程读写数据的情况
实验结论:
CPU密集型 多进程 或者 进程池
IO密集型 多线程 或者 线程池
无需并发 单个线程
"""
from multiprocessing import Pool
from concurrent.futures import ThreadPoolExecutor, as_completed
import time
# cpu密集型 求素数
def fun1(n):
num = []
for i in range(2, n):
for j in range(2, i):
if i % j == 0:
break
else:
num.append(i)
# print(num)
return num
# a = fun1(100)
# print(a)
# IO密集型 创建文件写入内容
def fun2(n):
fo = open("测试IO密集型文件.txt", "w")
fo.write("A" * n * 1000)
time.sleep(1)
fo.close()
return True
if __name__ == '__main__':
# 方便修改测试
# fun = fun1
fun = fun2
# 进程池
t1 = time.time()
p = Pool(3) # 进程池中从无到有创建三个进程,以后一直是这三个进程在执行任务
res_l = []
for i in [9999, 9999, 9999]:
res = p.apply_async(fun, args=(i,)) # 异步运行 先到先得
res_l.append(res)
# 关闭
p.close()
# 等待
p.join()
for res in res_l:
# 异步获取
print(res.get())
t2 = time.time()
print("进程池运行时间", t2 - t1)
# 线程池
t3 = time.time()
# 传输给下一个消息队列
l = []
urls = [9999, 9999, 9999]
with ThreadPoolExecutor() as pool:
# 函数、参数列表
f = [pool.submit(fun, url) for url in urls]
# # 等待全部结束 再返回 所以返回的顺序一定是和输入的一致
# for i in f:
# # print(i.result())
# l.append(i.result())
# 使用这个更快
# 谁结束 谁返回 所以返回的顺序是不定的
for j in as_completed(f):
# print(j.result())
l.append(j.result())
print(l)
t4 = time.time()
print("线程池运行时间", t4 - t3)
# 单个
t5 = time.time()
res_ = []
for i in [9999, 9999, 9999]:
res_.append(fun(i))
print(res_)
t6 = time.time()
print("正常单个运行时间", t6 - t5)