Celery、RabbitMQ和statsmodels的任务永远悬而未决



我正在尝试使用带有RabbitMQ的Celery来分发一些线性回归任务。该设置与示例add(x,y)函数配合使用很好,但当我实例化statsmodels OLS类时,例如

self.model = sm.OLS(self.y, self.X) 

工作者在消耗100%CPU的同时无限期地挂起。

发生了什么事?

默认情况下,celener使用多处理库作为并发实现。StatsModels的OLS方法调用Lapack,后者(以及Lapack/BLAS中的许多函数)启动自己的线程池以加快计算速度。不幸的是,线程在子进程分叉后不会继承,因此会创建一个僵尸。

以下是关于芹菜问题的讨论:https://github.com/celery/celery/issues/1842

但正如上一篇文章所指出的,这不是赛莱里的错。

关于OpenBLAS的问题,有一个很长的讨论:https://github.com/xianyi/OpenBLAS/issues/294

希望这在未来不会成为一个问题,因为OpenBLAS的默认构建现在是分叉安全的:http://numpy-discussion.10968.n7.nabble.com/Default-builds-of-OpenBLAS-development-branch-are-now-fork-safe-td36523.html

(自2014年2月9日起,您可能需要升级您的版本或安装最新的开发版本)。

两种解决方法:

  • 使用芹菜中的线程进程池(默认为prefork)。选项为--pool=threads
  • 不要使用依赖于Lapack或BLAS的函数。scipy中提供了线性回归的纯python实现:http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.linregress.html,例如

最新更新