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)

 

posted @ 2021-11-01 10:49  北风之神0509  阅读(1102)  评论(0编辑  收藏  举报