Joblib Parallel + Cython永久悬挂

时间:2018-11-27 09:59:29

标签: python parallel-processing cython joblib

在使用joblib.Parallel的Cython创建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

谢谢!

1 个答案:

答案 0 :(得分:0)

一段时间后,我终于找到了解决方案: 腌制程序状态以将其发送到不同的CPU时会出现死锁。 我不能完全确定原因,但是检查源代码后,似乎生成了新的线程来腌制对象,而这些线程正是导致死锁的原因。

一旦生成了进程,它们便会正常运行:通过库multiprocessing手动创建进程即可解决此问题。

或者,您可以使用multiprocessing.Pool手动指定start_method

from multiprocessing import get_context()

if __name__ == '__main__':
    with get_context("spawn").Pool() as pool:
        ...

您可以自由选择spawnforkserver作为start_method

如果需要更多信息,请访问this page