首页 > 解决方案 > Joblib Parallel + Cython 永远挂起

问题描述

在使用 Cython 创建 Python 扩展时,我遇到了一个非常奇怪的问题joblib.Parallel

以下代码按预期工作:

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.

谢谢!

标签: pythonparallel-processingcythonjoblib

解决方案


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

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

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

from multiprocessing import get_context()

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

您可以自由选择spawnforkserver作为start_method.

如果您想了解更多信息,请访问此页面。


推荐阅读