python 进程池、线程池、单线程 运行时间实验

进程池、线程池、单线程 运行时间实验

"""
进程池、线程池、单线程、
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)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

默执_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值