2012-03-10 34 views
4

我开始在我的Django项目中使用Celery,并且忍不住想知道:哪一种方式可以开始启动Celery的项目工作人员?哪个是在Django项目中启动芹菜最优雅的方法?

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

目前,启动芹菜的推荐方式似乎是更简单的设置中的python manage.py celeryd,以及更复杂的设置中的/etc/init.d/celeryd start。然而,在第一种情况下,这个过程感觉很脆弱,因为过程不会自动启动,而第二个过程需要相当多的项目特定配置(virtualenv,settings等)。特别是后者表明我一般的感觉是芹菜工人与它所涉及的代码库密切相关,而且它与主项目过程也紧密相连,因为没有任何东西来实际创建任务的Celery工人实际上是无用的(有一个例外是celerybeat)。 init.d脚本的另一个问题是,他们需要一些先进的逻辑来处理每个服务器的多个项目(具有独立的虚拟环境,设置,路径等)。

所以我想,启动配置可能是相当优雅的celeryd连同我的主要过程,例如从Apache mod_wsgi中产生它(类似于其他设置选项),从而在主进程停止时(/etc/init.d/apache2 stop)终止它。然而,我不太清楚在这个推理中是否存在考虑性能和/或安全性的技术陷阱 - 可能是这种情况,因为我尝试了使用Google搜索并没有发现任何东西。

  1. 考虑到芹菜架构,我的推理是否有缺陷?
  2. 我能以某种方式在mod_wsgi以内的某处产生celeryd,这是否合理?
  3. 您如何在您的项目中启动芹菜工人?
+3

查看[supervisor](http://supervisord.org/)管理进程。在我的服务器上,我管理'nginx','gunicorn/uwsgi','postgres'和许多使用它的django项目。这可能是启动和停止芹菜的好方法 – 2012-03-10 17:16:39

回答

3

我使用manage.py芹菜启动芹菜,并与管理员一起管理。对修改我已经部署并重新启动Apache的后,我只需重新启动芹菜任务每个部署\

编辑:

我们用厨师来管理我们的主管和其他流程的配置,所以这可能是一个有点过度杀人。我们有一个主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 

这将重新启动管理进程芹菜,拿起你定义的任何新的任务。

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

+2

也许你可以提供一个'supervisord'配置示例?你的答案有点薄。 – 2012-11-03 17:22:31

+0

欢迎来到P.SE - 回应Martijn,请扩展您的答案以更全面地解释。 – Andrew 2012-11-03 17:31:33