多处理支持的并行循环不能嵌套在线程下面

Posted

技术标签:

【中文标题】多处理支持的并行循环不能嵌套在线程下面【英文标题】:Multiprocessing backed parallel loops cannot be nested below threads 【发布时间】:2015-02-23 02:41:13 【问题描述】:

joblib 中出现此类问题的原因是什么? '多处理支持的并行循环不能嵌套在线程下,设置 n_jobs=1' 我应该怎么做才能避免这样的问题?

实际上我需要实现 XMLRPC 服务器,它在后台线程中运行大量计算,并通过 UI 客户端的轮询报告当前进度。它使用基于 joblib 的 scikit-learn。

附: 我只是将线程的名称更改为“MainThread”以避免此类警告,并且一切看起来都很好(按预期并行运行而没有问题)。这种解决方法将来可能会出现什么问题?

【问题讨论】:

据我了解,问题在于您的一个线程产生了另一个多线程计算。我个人认为不需要这样做(是的,您可以使用复杂的 fork 模型,但为什么要为此使用并行循环?)因为大概,您已经在利用所有的并行性了。 我收到了一个非常相似的错误,但使用的是多处理而不是线程:Loky-backed parallel loops cannot be called in a multiprocessing, setting n_jobs=1。有人知道这个的解决方案吗? 【参考方案1】:

我在线程中使用 sklearn 进行预测时遇到了同样的警告,使用的是我加载的模型,该模型配备了 n_jobs > 1。当您腌制模型时,它会出现,它会保存其参数,包括 n_jobs。

为避免警告(以及潜在的序列化成本),在酸洗模型时将 n_jobs 设置为 1:

clf = joblib.load(model_filename).set_params(n_jobs=1)

【讨论】:

【参考方案2】:

这似乎是由于 JobLib 库中的 issue 所致。在撰写本文时,这似乎已修复但尚未发布。正如问题中所写,一个肮脏的修复方法是将主线程重命名为MainThread

threading.current_thread().name = 'MainThread'

【讨论】:

你怎么称呼这个?它对我没有影响。 @Cerin 在我初始化并安装分类器之前。 这对我也没有影响。 我刚刚注意到在我升级了一些库后问题又开始出现了。看起来行为发生了变化。 有什么更新吗?我还注意到更新库时发生的行为

以上是关于多处理支持的并行循环不能嵌套在线程下面的主要内容,如果未能解决你的问题,请参考以下文章

java 多线程死循环怎么动态传参?急!

JAVA并行框架学习之ForkJoin

JAVA并行框架学习之ForkJoin

Stream多线程并行数据处理

关于多线程提高程序执行速率的问题

控制并行循环中的线程数并减少开销