在使用joblib.Parallel创建Python扩展时,我遇到了一个非常奇怪的问题。
以下代码按预期工作:
from joblib import Parallel, delayed
from math import sqrt
print(Parallel(n_jobs=4)(delayed(sqrt)(x) for x in range(4)))以下代码永远挂起:
from joblib import Parallel, delayed
def mult(x):
return x*3
print(Parallel(n_jobs=4)(delayed(mult)(x) for x in range(4)))我不知道为什么。我使用下面的setup.py
from distutils.core import setup
from Cython.Build import cythonize
setup(
ext_modules = cythonize("file.pyx")
)我使用python setup.py build_ext --inplace创建了这个扩展,并将其作为import file导入。
谢谢!
发布于 2018-12-12 00:42:33
经过一段时间后,我终于找到了解决方案:在酸洗程序状态以将其发送到不同的CPU时出现死锁。我不能完全确定原因,但检查源代码,看起来好像生成了新的线程来访问对象,而这些线程就是导致死锁的线程。
一旦生成了进程,它们就可以正常运行:通过库multiprocessing手动创建进程可以解决这个问题。
或者,也可以使用multiprocessing.Pool手动指定start_method
from multiprocessing import get_context()
if __name__ == '__main__':
with get_context("spawn").Pool() as pool:
...您可以自由选择spawn或forkserver作为start_method。
如果您想了解更多信息,请访问this page。
https://stackoverflow.com/questions/53497078
复制相似问题