米米米米粒儿~ 2024-05-23 13:24 采纳率: 66.7%
浏览 12

关于#python#的问题:python利用pool.apply_async开启多进程运算之后,cpu利用率很低是什么原因

python利用pool.apply_async开启多进程运算之后,cpu利用率很低是什么原因?

    if len(total_array) >= multiprocessing.cpu_count():
        pool_number = multiprocessing.cpu_count()
    else:
        pool_number = len(total_array)
    print("总共区域有:", len(total_array), '开启的进程数量为:', pool_number)
    pool = multiprocessing.Pool(pool_number)
    for threshold2 in range(10, 11, 1): #计算多组阈值
        new_normals_dict = dict()  # 创建一个字典
        for array in total_array: #法向量修正
            neighborhood_zone_dict = dict()
            normal_dict = dict()
            points_dict = dict()
            for i in self_function.expand_neigborhood_number(array, neighbor, 1):
                neighborhood_zone_dict[i] = neighbor[i]
                normal_dict[i] = normals[i]
                points_dict[i] = points[i]
            # result = self_function.cal_xiaosheng_normals_mut1(array, neighborhood_zone_dict, normal_dict, points_dict, threshold2, )
            # new_normals_dict.update(result)
            result = pool.apply_async(func=self_function.cal_xiaosheng_normals_mut1,
                                      args=(array, neighborhood_zone_dict, normal_dict, points_dict, threshold2,))
            new_normals_dict.update(result.get())
        pool.close()
        pool.join()

  • 写回答

2条回答 默认 最新

  • 阿里嘎多学长 2024-05-23 13:51
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    【您想要解决的问题】:您提问的目的是解决在使用Python的multiprocessing模块中的Pool对象和apply_async方法开启多进程运算时,CPU利用率低的问题。

    【问题出现原因】:

    1. 进程数量设置:您的代码中根据total_array的长度和CPU核心数来决定进程的数量,这本身是合理的,但如果任务本身不适合并行处理,或者进程间存在大量的数据交换,这可能导致CPU利用率不高。
    2. GIL(全局解释器锁):Python的GIL会限制原生线程的并行执行,尽管您使用的是多进程,但如果子进程中调用了大量Python原生代码,GIL仍可能间接影响性能。
    3. I/O阻塞:如果self_function.cal_xiaosheng_normals_mut1函数中包含I/O操作(如读写文件、网络请求等),这些操作可能会阻塞进程,导致CPU等待I/O操作完成,从而降低利用率。
    4. 任务粒度:如果每个任务执行的时间非常短,进程创建和销毁的开销可能会超过任务执行的收益,这也会导致CPU利用率不高。
    5. 资源竞争:多进程之间可能会产生资源竞争,如内存、CPU缓存等,这会降低效率。

    【问题解决方案】:

    1. 分析任务特性:确定您的任务是否真的适合并行处理,以及是否存在I/O阻塞。
    2. 优化任务粒度:确保每个任务有足够的工作量,以覆盖进程管理的开销。
    3. 使用进程池:您已经使用了进程池,这是正确的。但可以考虑使用pool.map代替pool.apply_async,因为map方法可以自动分配任务给进程,可能会更高效。
    4. 减少GIL影响:如果可能,尝试使用C扩展或其他语言编写性能关键部分,以减少GIL的影响。
    5. 资源监控:监控系统资源使用情况,确保没有资源瓶颈。

    【提供代码】:由于没有具体的self_function.cal_xiaosheng_normals_mut1函数实现,无法提供具体的修改代码。但可以考虑以下修改:

    • 确保self_function.cal_xiaosheng_normals_mut1尽可能高效,减少I/O操作。
    • 如果适用,使用pool.map代替apply_async

    【代码运行方式】:您的代码需要在支持Python的操作系统上运行,并且需要有Python环境以及multiprocessing模块。直接运行Python脚本即可。

    【代码预期运行结果】:无法提供具体的预期运行结果,因为这取决于self_function.cal_xiaosheng_normals_mut1函数的具体实现和任务特性。

    【推荐相关链接】:

    1. Python multiprocessing 官方文档
    2. 理解Python的GIL
    3. Python并行和并发编程
    4. Python多进程编程
    5. Python中进程池的使用
    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 5月23日

悬赏问题

  • ¥15 is not in the mmseg::model registry。报错,模型注册表找不到自定义模块。
  • ¥15 安装quartus II18.1时弹出此error,怎么解决?
  • ¥15 keil官网下载psn序列号在哪
  • ¥15 想用adb命令做一个通话软件,播放录音
  • ¥30 Pytorch深度学习服务器跑不通问题解决?
  • ¥15 部分客户订单定位有误的问题
  • ¥15 如何在maya程序中利用python编写领子和褶裥的模型的方法
  • ¥15 Bug traq 数据包 大概什么价
  • ¥15 在anaconda上pytorch和paddle paddle下载报错
  • ¥25 自动填写QQ腾讯文档收集表