python - 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
.
谢谢!
解决方案
一段时间后,我终于找到了解决方案:在腌制程序状态以将其发送到不同的 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
.
如果您想了解更多信息,请访问此页面。
推荐阅读
- logging - 使用 serilog 记录 Application Insight 自定义维度
- npm - 更新 NPM 中的依赖项以解决漏洞
- javascript - 如何使用从角度服务导入的数据绘制谷歌图表?
- javascript - 在 Google Apps 脚本中从另一个电子表格编辑一个电子表格
- hyperledger-fabric - 如何在 Hyperledger Fabric 中的智能合约实例之间发送消息?
- node.js - Google Dialogflow 没有利用我的更改
- javascript - 你如何在 R Leaflet 中实现传单插件“Leaflet.Control.Layers.Tree”
- python - 在 python Tkinter 中删除一个特定的小部件
- html - 将禁止 google bot 抓取 google 搜索控制台使用的 HTML 未经 GSC 授权的站点
- python - 如何从另一个文件中给出优先顺序的列中提取数据?