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%行的写法。