首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Joblib并行+ Cython永远挂起

Joblib并行+ Cython永远挂起
EN

Stack Overflow用户
提问于 2018-11-27 17:59:29
回答 1查看 966关注 0票数 1

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

以下代码按预期工作:

代码语言:javascript
复制
from joblib import Parallel, delayed
from math import sqrt

print(Parallel(n_jobs=4)(delayed(sqrt)(x) for x in range(4)))

以下代码永远挂起:

代码语言:javascript
复制
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

代码语言:javascript
复制
from distutils.core import setup
from Cython.Build import cythonize

setup(
    ext_modules = cythonize("file.pyx")
)

我使用python setup.py build_ext --inplace创建了这个扩展,并将其作为import file导入。

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2018-12-12 00:42:33

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

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

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

代码语言:javascript
复制
from multiprocessing import get_context()

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

您可以自由选择spawnforkserver作为start_method

如果您想了解更多信息,请访问this page

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53497078

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档