在使用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
。
谢谢!
答案 0 :(得分:0)
一段时间后,我终于找到了解决方案: 腌制程序状态以将其发送到不同的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。