在 Python 中使用 Open3D 进行多重处理时,为什么我的函数会挂起?

问题描述 投票:0回答:1

我正在尝试使用 Python 中的

multiprocessing
模块来运行使用 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__':
    print("RUN foo")
    foo()

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

当我运行代码时,函数 foo() 在直接调用时可以正确执行,但是当我尝试使用多处理运行它时,它在启动进程后挂起。

**Versions**:
- numpy==1.24.2
- open3d==0.18.0
- python==3.10.15
- ubuntu==20.04

我找不到任何解决方案,所以我来到这里。

python open3d o3d
1个回答
0
投票

代码挂起的原因之一是由于使用

fork
的多进程,并且 Open3D 使用具有自己的内部线程的 OpenMP 库。请参阅相关的 Open3D issue 和 Python 文档 here:

请注意,安全分叉多线程进程是有问题的。

尝试致电

multiprocessing.set_start_method("spawn")
multiprocessing.set_start_method("forkserver")

在创建

multiprocessing.Process
对象之前。

© www.soinside.com 2019 - 2024. All rights reserved.