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 @   北风之神0509  阅读(1221)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
点击右上角即可分享
微信分享提示