【python】基于multiprocessing.Pool实现python并行化的坑和解决方案

news2024/9/22 17:32:25

坑1:apply_async调用的子函数不执行或执行不彻底的解决方案

解决:使用apply_async时传入error_callback检查报错


from multiprocessing import Pool

def processFolder(idx, folders, o_dir):
    train_mesh = TrainMeshes(folders)
    output_path = os.path.join(o_dir, str(idx) + '.pkl')
    pickle.dump(train_mesh, file=open(output_path, "wb"))


	
if __name__ == '__main__':
	train_mesh_folders = ['mesh1','mesh2']
    n_processes = os.cpu_count()
    n_processes =2
    print('n_processes: ', n_processes)
    pool = Pool(processes=n_processes)  # 进程池
    # split folders into n_processes parts
    split_folders = np.array_split(train_mesh_folders, n_processes)

    pool.apply_async(processFolder, args=(0, split_folders[0], output_dir,))
    pool.apply_async(processFolder, args=(1, split_folders[1], output_dir,))

    pool.close()
    pool.join()

运行上面多进程的程序,调用的程序只运行了一小部分就退出了,也没个报错。
让人摸不着头脑。
看起来没有报错,其实有报错!!!
在这里插入图片描述
把上面的程序 pool.apply_async中加入error_callback,就发现问题了


from multiprocessing import Pool

def processFolder(idx, folders, o_dir):
    train_mesh = TrainMeshes(folders)
    output_path = os.path.join(o_dir, str(idx) + '.pkl')
    pickle.dump(train_mesh, file=open(output_path, "wb"))

def error_callback(e):
    print('error_callback: ', e)
	
	
if __name__ == '__main__':
	train_mesh_folders = ['mesh1','mesh2']
    n_processes = os.cpu_count()
    n_processes =2
    print('n_processes: ', n_processes)
    pool = Pool(processes=n_processes)  # 进程池
    # split folders into n_processes parts
    split_folders = np.array_split(train_mesh_folders, n_processes)

    pool.apply_async(processFolder, args=(0, split_folders[0], output_dir,), error_callback=error_callback)
    pool.apply_async(processFolder, args=(1, split_folders[1], output_dir,), error_callback=error_callback)

    pool.close()
    pool.join()

在这里插入图片描述
可以看到,有报错!!!!
但也很奇怪,不使用多进程,不会报错。可能我程序写的还是不好。反正改完报错,多进程就能顺利运行了。

参考文献:

Python进程池apply_async的callback函数不执行的解决方案
Python并发编程:为什么传入进程池的目标函数不执行,也没有报错?

坑2:from multiprocessing import Pool进程池中torch有关函数卡住

torch.min(V[:,0])
torch.sparse.FloatTensor(i, v, torch.Size(shape))
实测这两个函数都会卡死

解决:使用线程代替进程 ,改为from multiprocessing.pool import ThreadPool as Pool

def normalizeUnitCube(V):
    '''
    NORMALIZEUNITCUBE normalize a shape to the bounding box by 0.5,0.5,0.5

    Inputs:
        V (|V|,3) torch array of vertex positions

    Outputs:
        V |V|-by-3 torch array of normalized vertex positions
    '''
    V = V - torch.min(V,0)[0].unsqueeze(0)
    # x_min = torch.min(V[:,0])
    # y_min = torch.min(V[:,1])
    # z_min = torch.min(V[:,2])
    # min_bound = torch.tensor([x_min, y_min, z_min]).unsqueeze(0)
    # V = V - min_bound

    V = V / torch.max(V.view(-1)) / 2.0
    return V

上面的函数对点集进行标准化。V是一个二维张量,其实是(Nx3)的顶点列表。
实测用torch.min(V,0)会卡住,用注释的代码才可以。torch.min(V[:,0])才能跑。

def tgp_midPointUp(V, F, subdIter=1):
    """
    perform mid point upsampling
    """
    Vnp = V.data.numpy()
    Fnp = F.data.numpy()
    VVnp, FFnp, SSnp = midPointUpsampling(Vnp, Fnp, subdIter)
    VV = torch.from_numpy(VVnp).float()
    FF = torch.from_numpy(FFnp).long()

    SSnp = SSnp.tocoo()
    values = SSnp.data
    indices = np.vstack((SSnp.row, SSnp.col))
    i = torch.LongTensor(indices)
    v = torch.FloatTensor(values)
    shape = SSnp.shape
    SS = torch.sparse.FloatTensor(i, v, torch.Size(shape))  #在这里会卡死
    return VV, FF, SS

常用解决办法

  • 调用pathos包下的multiprocessing模块代替原生的multiprocessing。pathos中multiprocessing是用dill包改写过的,dill包可以将几乎所有python的类型都serialize,因此都可以被pickle。
  • 使用线程代替进程 from multiprocessing.pool import ThreadPool as Pool
  • 可以使用 copy_reg 来规避异常
  • 把调用的函数写在顶层规避
  • 重写类的内部函数规避

参考文献

python多进程踩过的坑

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/690295.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python小游戏——骰子猜大小

❄️作者介绍:奇妙的大歪❄️ 🎀个人名言:但行前路,不负韶华!🎀 🐽个人简介:云计算网络运维专业人员🐽 前言 我们已经基本学完了,逻辑判断和循环的用法&#…

Maven历史版本的下载

Maven历史版本的下载 打开Maven官网https://maven.apache.org/ 点击Download 点击Maven 3 archives

持续优化 XView 性能,大促弹窗搭投实践 | 京东云技术团队

背景 618 大促来了,对于业务团队来说,最重要的事情莫过于各种大促营销。如会场、直播带货、频道内营销等等。而弹窗作为一个极其重要的强触达营销工具,通常用来渲染大促氛围、引流主会场、以及通过频道活动来提升频道复访等。因此&#xff0…

Apache JMeter配置步骤压力测试实例

一. 安装环境:................................................................................................................ 2 二.安装步骤:...................................................................................…

QGis出图

工程——新建打印布局。 水平垂直参考线的妙用,很好用。 【【QGIS出图教程】免费软件!地理科研论文制图,出研究区位图,比Arcgis出图好使】

快速入门SringCloud

认识微服务 微服务是一种经过良好架构设计的分布式架构方案,微服务的特征有: 单一职责:微服务拆分粒度小,每一个服务都对应唯一的业务能力,做到单一职责,避免重复开发面向服务:微服务对外暴露…

linux 资源包安装详细教程

linux 资源包安装详细教程 一、离线下载安装1.1 下载1.2 安装1.3 错误:依赖检测失败 - 解决方案1.4 查看安装的包情况 二、在线安装 一、离线下载安装 1.1 下载 点击进入网页:linux资源包下载链接:pkgs.org在搜索栏输入需要的包&#xff0c…

d3dcompiler_47.dll丢失怎么解决(解决方案)

d3dcompiler_47.dll在Windows操作系统和 DirectX应用程序中使用此 DLL 文件,包括游戏,图形处理软件,CAD软件和其他3D应用程序中。如果电脑提示“由于找不到d3dcompiler_47.dll,无法继续执行此代码”,“d3dcompiler_47.dll缺失”&a…

C#多语言切换

第一步建立工程 第二步:拖拽控件 第三步选择窗体 第四步修改窗体localizable 属性为 true 如下图 第五步 修改language 属性 如下图 第六步:修改各个控件的字符名称 会出现下面的资源文件(注意之前是没有资源文件的) 第七步&…

Druid 数据库密码加密-代码详解

这次来详细说下 Druid 数据库密码加密-代码详解 第一种方法使用原生加解密 首先需要使用druid的密码加密功能加密密码 > 找到druid jar文件地址 执行 加密命令 java -cp druid-1.2.10.jar com.alibaba.druid.filter.config.ConfigTools you_password 会得到以下信息 priva…

回顾 | Learn From Microsoft Build Ⅱ:Data

点击蓝字 关注我们 编辑:Alan Wang 排版:Rani Sun 微软 Reactor 为帮助广开发者,技术爱好者,更好的学习 .NET Core, C#, Python,数据科学,机器学习,AI,区块链, IoT 等技术&#xff0…

动态隐藏显示底部Tab栏

方式1 路由源信息 方式2 css样式 css功能:让盒子盖住整个页面 给div.city添加.page-cover的类(让div.city盖住页面的tabbar) /* 让盒子盖住整个页面 */ .page-cover {position: relative;z-index: 2;height: 100vh;background-color: #fff;…

计算机组成原理(期末或考研备考)-计算机系统概述重点

1.1计算机发展历程 1946第一台电子数字计算机(ENIAC)第一代计算机(1946-1957)-- 电子管;体积大,容量小,成本高,速度慢。第二代计算机(1958-1964)-- 晶体管;运算速度提升…

java之路—— SpringMVC的基本详解

文章目录 前言一、 核心的组件二、基本实现流程三、MVC的基本配置使用 前言 Spring MVC是一个用于构建Web应用程序的基于MVC(Model-View-Controller)设计模式的框架。 它是Spring Framework的一部分,提供了一种灵活、可扩展且功能强大的方式…

Android APT 系列 (三):APT 技术探究

APT 介绍 什么是 APT ? APT 全称 Annotation Processing Tool,翻译过来即注解处理器。引用官方一段对 APT 的介绍:APT 是一种处理注释的工具, 它对源代码文件进行检测找出其中的注解,并使用注解进行额外的处理。 APT 有什么用?…

基于Java+Swing实现推箱子游戏

基于JavaSwing实现推箱子游戏 一、系统介绍二、功能展示三、其他系统四、获取源码 一、系统介绍 基于JAVA的推箱子游戏系统主要用于实现游戏推箱子功能,提供多种不同难度的关卡。本系统结构如下: (1)初始化模块: 该模块包括屏幕初…

如何用 ChatGPT 和你的卡片笔记对话?开源应用 Quivr 尝试

卡片 我 非常喜欢使用卡片笔记。其优点明显,例如能显著减轻写作压力。在你面对空白屏幕时,写一篇文章的压力可能会很大,而随时三言两语记录卡片笔记则显得更为轻松。由于笔记以卡片形式存在,可以进行大量重组复用,对于…

基于SpringBoot+vue的音乐网站与分享平台设计与实现

博主介绍: 大家好,我是一名在Java圈混迹十余年的程序员,精通Java编程语言,同时也熟练掌握微信小程序、Python和Android等技术,能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

分布式理论和一致性算法详解

1、什么是分布式系统 分布式系统是一个硬件或软件组成分布在不同的网络计算机上,彼此之间仅仅通过消息传递进行通信和协调的系统 2、分布式系统的特征 分布性 分布式系统的多台计算机都会在空间上随意分布的,同时,机器的分布情况也会随时变动…

【详细分析】thinkphp反序列化漏洞

文章目录 配置xdebug反序列化漏洞利用链详细分析poc1(任意文件删除)测试pocpoc2(任意命令执行)poc3(任意命令执行) 补充代码基础函数trait关键字应用案例优先级多trait 配置xdebug php.ini [Xdebug] zend…