哪个是在Django项目中启动celeryd最优雅的方式?

时间:2012-03-10 14:27:36

标签: django deployment mod-wsgi django-celery

我在我的Django项目中开始使用Celery并且无法想知道:开始为项目启动Celery工作人员的最优雅方式是什么?

让我解释这个问题的推理。

目前,推荐的Celery启动方式似乎是python manage.py celeryd更简单的设置,而/etc/init.d/celeryd start更复杂的方式。但是,在第一种情况下,此过程感觉很脆弱,因为该过程不会自动启动,而第二种情况需要相当多的项目特定配置(virtualenvsettings等。)后者证明了我的一般感觉,即Celery工作者与代码库密切相关,而且它与主要项目流程密切相关,因为Celery工作者没有实际创建任务的东西它实际上是无用的(有一个例外是celerybeat)。 init.d脚本的另一个问题是,他们需要一些高级逻辑来处理每个服务器的多个项目(具有单独的虚拟环境,设置,路径等)。

所以我认为,与我的主要流程一起启动celeryd可能是非常优雅的配置。使用Apache从mod_wsgi生成它(类似于其他设置选项),因此在主进程关闭时将其终止(/etc/init.d/apache2 stop)。但是,我不太确定在这种推理中是否存在考虑性能和/或安全性的任何技术陷阱 - 可能也是如此,因为我尝试使用Google搜索并发现几乎没有任何内容。

  1. 考虑到芹菜架构,我的推理是否有缺陷?
  2. 我可以以某种方式从celeryd内的某个地方产生mod_wsgi,这是明智的吗?
  3. 您如何在项目中启动Celery工作人员?

1 个答案:

答案 0 :(得分:3)

我使用manage.py celeryd启动芹菜并与主管一起管理芹菜。在修改任务的每个部署中,我在部署并重新启动apache之后只需重新启动celery。\

编辑:

我们使用chef来管理我们的主管和其他进程的配置,所以这可能有点过分了。我们有一个主supervisord.conf,它包含我们运行的每个站点的单独配置文件。其中一个可能是这样的:

[program:celery_newproject]
command = /srv/www/.virtualenvs/newprojectenv/bin/python /srv/www/projects/newproject/manage.py celeryd --concurrency=2 --settings=settings.alpha --pidfile=/var/run/celery/celery_newproject.pid
user = wsgiuser
environment = PYTHON_EGG_CACHE="/tmp/.python-eggs"

在部署时,我们只需运行

sudo supervisorctl restart celery_newproject

这会重新启动celery的主管流程并获取您定义的任何新任务。

还有其他非优雅的方法可以做到这一点。在我的个人网站上,我只有一个运行的cron作业,检查是否存在.pid文件,如果它不存在则重新启动芹菜。根本不优雅,但它适用于低可靠性站点。