You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python multiprocessing调用Open3D函数时进程挂起原因排查

解决Open3D结合multiprocessing时进程挂起的问题

问题场景

直接调用基于Open3D的点云处理函数foo()可正常执行,但通过multiprocessing.Process启动子进程后,进程出现挂起无法完成。环境版本:

  • numpy==1.24.2
  • open3d==0.18.0
  • python==3.10.15
  • ubuntu==20.04

原因分析

Ubuntu系统下multiprocessing默认使用fork启动方式,该方式会完整复制父进程的内存资源,包括Open3D底层维护的全局状态、线程池或锁资源。子进程继承这些资源后,执行estimate_normals等操作时会触发资源冲突,最终导致死锁或进程挂起。

解决方案

1. 切换为spawn启动方式

spawn方式会从头启动新的Python进程,重新加载所有模块并初始化资源,完全避免继承父进程的Open3D底层资源,从根源上解决冲突问题。

2. 限制Open3D操作在子进程函数内部

不在全局作用域创建Open3D对象,确保子进程内的点云操作完全独立初始化。

修改后的代码示例

import multiprocessing
import numpy as np
import open3d as o3d

def foo():
    pcd = o3d.geometry.PointCloud()
    pcd.points = o3d.utility.Vector3dVector(np.array([[0, 0, 0], [1, 1, 1], [2, 2, 2]]))    
    pcd.estimate_normals(search_param=o3d.geometry.KDTreeSearchParamHybrid(radius=0.1, max_nn=30))
    print("normal", np.asarray(pcd.normals))

if __name__ == '__main__':
    # 必须在创建进程前设置启动方式
    multiprocessing.set_start_method('spawn')
    
    print("RUN foo")
    foo()

    print("RUN foo with multiprocessing")
    p = multiprocessing.Process(target=foo)
    p.start()
    p.join()

扩展说明

如果使用multiprocessing.Pool,同样需要指定spawn上下文:

import multiprocessing
import numpy as np
import open3d as o3d

def foo():
    # 子进程内的点云操作
    pcd = o3d.geometry.PointCloud()
    pcd.points = o3d.utility.Vector3dVector(np.array([[0, 0, 0], [1, 1, 1], [2, 2, 2]]))    
    pcd.estimate_normals(search_param=o3d.geometry.KDTreeSearchParamHybrid(radius=0.1, max_nn=30))
    return np.asarray(pcd.normals)

if __name__ == '__main__':
    # 创建spawn上下文的进程池
    ctx = multiprocessing.get_context('spawn')
    with ctx.Pool(processes=2) as pool:
        result = pool.apply(foo)
        print("normal", result)

spawn启动方式的开销略大于fork,但这是避免Open3D底层资源冲突的必要手段,能保证多进程下点云处理的稳定性。

内容的提问来源于stack exchange,提问作者Shika_meow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 20:40:16