zoukankan      html  css  js  c++  java
  • python多进程和多线程效率比较,ProcessPoolExecutor,ThreadPoolExecutor

    一下代码使用官方进程池和线程池测试,运行10万次函数时间。

    import time
    from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor
    # import nb_log
    
    def f(x):
        pass
        if x%1000 == 0:
            print(x)
    
    
    if __name__ == '__main__':
        pool = ProcessPoolExecutor(10)  # 这个分别测试进程池和线程池运行10万次无io 无cpu函数的耗时
        # pool = ThreadPoolExecutor(10)
        t1 = time.time()
        for i in range(100000):
            pool.submit(f, i)
        pool.shutdown()
        print(time.time() - t1)

    win上进程池消耗240秒,linux虚拟机进程池消费26秒。

    win线程池消耗4秒,linux虚拟机线程池1.3秒。

    总之就是进程池性能不是很好。linux跑代码比win上更适合,通常情况下,性能更好,特别是涉及到信号量 并发 文件锁什么的,linux性能明显好于win。

    多进程光是主进程submit任务都要消耗大量cpu。每秒执行任意函数不可能突破1000次。

    进程池不适合快速频繁sumit,不适合频繁操作进程queue,适合直接启动多个进程,每个进程自己从redis拉取任务,这样的10进程性能暴击ProcessPoolExecutor的submit。

    下面的方式是自动每进程拉取redis消费。没有涉及到父子进程通过进程queue通信解耦消费。

    import time
    from concurrent.futures import ProcessPoolExecutor, ThreadPoolExecutor
    import nb_log
    from function_scheduling_distributed_framework import task_deco, BrokerEnum,ConcurrentModeEnum
    
    
    @task_deco('test_multi', broker_kind=BrokerEnum.REDIS, log_level=20,concurrent_mode=ConcurrentModeEnum.SINGLE_THREAD)
    def f(x):
        pass
        if x % 1000 == 0:
            print(x)
    
    
    if __name__ == '__main__':
        for i in range(100000):
            f.push(i)
        f.multi_process_consume(10)
    反对极端面向过程编程思维方式,喜欢面向对象和设计模式的解读,喜欢对比极端面向过程编程和oop编程消耗代码代码行数的区别和原因。致力于使用oop和36种设计模式写出最高可复用的框架级代码和使用最少的代码行数完成任务,致力于使用oop和设计模式来使部分代码减少90%行,使绝大部分py文件最低减少50%-80%行的写法。
  • 相关阅读:
    【python】一个文件内容写入另一个
    【Linux】批量修改权限
    【Git】git add git commit
    赌博游戏
    输出斐波那契数列前20项,每输出5个数换行
    Java线程的几种可用状态
    Java创建线程的方式
    Java虚拟机
    判断对象oStringObject是否为String
    throw跟throws关键字
  • 原文地址:https://www.cnblogs.com/ydf0509/p/15492475.html
Copyright © 2011-2022 走看看