Python - 调试多处理、导入和外部 C 库之间的干扰

问题描述

我在运行的一段代码中遇到了一些死胡同,这似乎涉及 python 线程、导入和外部 C 库。

问题的要点如下。我需要计算大量大稀疏矩阵的近似逆。对我来说幸运的是,有一个 scikits.sparse.cholmod 外部库,它基本上公开了一个广为人知和使用的 C 库 "SuiteSparse"

虽然它确实有一些对并行的本机支持,但我发现对于现代多核处理器,通过在隐式并行化之上添加显式并行化很容易获得一些加速。为了做到这一点,我定义了一个函数来包装一个包含需要反转的矩阵的对象、cholmod-wrapping 函数以及一个处理反转矩阵并将结果存储到数据库和 d 调用 {{ 1}} 然后将其发送到 Python 的 cholmod multiprocessing 并带有 Pool:

map

对于第一遍,这一切都很好。问题是,如果我尝试执行中间分析并且需要在我的代码中重新启动池,则第二次生成失败,但无声无息。具体来说,在调用 with Pool(processes=pool_size) as pool: try: pool.map(my_function,arguments_puck) except Exception as e: # log and raise the exception 的那一行,在第二次 cholmod 调用期间,所有进程都无声无息地无限期挂起。

如果我不使用多处理模块,则不会出现此问题。

如果我事后在主进程中调用 pool.map 也不会出现这个问题。

我尝试通过添加线程异常句柄 (cholmod) 以及启用警告捕获 (threading.excepthook = function_that_will_log_and_raise) 来跟踪问题。他们都没有得到任何表明可能发生锁定的信息。

我试图盲目地解决在每次使用 logging.captureWarnings(True) 之后的 scikits.sparse.cholmod 的新调用之前强制重新导入 importlib.reload(chmd) 的问题。

我也尝试通过在 import scikits.sparse.cholmod as chmd pool.terminate() 上下文中的 try-except 之后添加 Pool 来强制所有线程终止拉取。

此时,我不确定如何进行调试。我真的不能为 with 函数设置标志来查看究竟是什么失败了,因为它是 C/C++ 代码一个薄包装。我的预感是 cholmod 在内部产生的线程与由 python 多处理生成的线程之间存在一些干扰,但我不知道如何进一步追踪问题。

有没有什么办法可以在不深入研究 C/C++ 代码的情况下弄清楚发生了什么?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)