芹菜、RabbitMQ和statsmodels永远挂起的任务

芹菜、RabbitMQ和statsmodels永远挂起的任务,rabbitmq,celery,statsmodels,Rabbitmq,Celery,Statsmodels,我正在尝试使用芹菜和RabbitMQ分配一些线性回归任务。这个设置与示例add(x,y)函数配合得很好,但是当我实例化statsmodels类时,例如 self.model = sm.OLS(self.y, self.X) 工作进程无限期挂起,同时消耗100%的CPU 发生了什么?默认情况下,芹菜使用多处理库作为并发实现。StatsModels的OLS方法调用Lapack,Lapack(以及Lapack/BLAS中的许多函数)启动自己的线程池以加速计算。不幸的是,线程不会在子进程分叉后继承,

我正在尝试使用芹菜和RabbitMQ分配一些线性回归任务。这个设置与示例add(x,y)函数配合得很好,但是当我实例化statsmodels类时,例如

self.model = sm.OLS(self.y, self.X) 
工作进程无限期挂起,同时消耗100%的CPU


发生了什么?

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

以下是芹菜问题的讨论:

但正如最后一篇文章所指出的,这不是芹菜的错

关于OpenBLAS的问题有一个很长的讨论:

希望这在将来不会成为问题,因为OpenBLAS的默认版本现在是fork安全的:

(截至2014年2月9日-您可能需要升级您的版本或安装最新的开发版本)

两个变通办法:
  • 使用芹菜中的线程进程池(默认为prefork)。选项是--pool=threads
  • 不要使用依赖Lapack或BLAS的函数。例如,scipy:中提供了线性回归的纯python实现

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

以下是芹菜问题的讨论:

但正如最后一篇文章所指出的,这不是芹菜的错

关于OpenBLAS的问题有一个很长的讨论:

希望这在将来不会成为问题,因为OpenBLAS的默认版本现在是fork安全的:

(截至2014年2月9日-您可能需要升级您的版本或安装最新的开发版本)

两个变通办法:
  • 使用芹菜中的线程进程池(默认为prefork)。选项是--pool=threads
  • 不要使用依赖Lapack或BLAS的函数。例如,scipy:中提供了线性回归的纯python实现

我也有同样的问题。你解决过这个问题吗?我也有同样的问题。你解决过这个问题吗?