问题描述
我在运行的一段代码中遇到了一些死胡同,这似乎涉及 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 (将#修改为@)