使用celeryd作为具有多个django应用程序的守护进程?

时间:2012-04-19 18:23:14

标签: daemon celery django-celery celeryd

我刚刚开始使用django-celery,我想将celeryd设置为守护进程。但是,instructions似乎表明它一次只能配置一个站点/项目。芹菜可以处理多个项目,还是只能处理一个项目?并且,如果是这种情况,是否有一种干净的方法来设置celeryd为每个配置自动启动,这需要我为每个配置创建一个单独的init脚本?

2 个答案:

答案 0 :(得分:9)

像所有有趣的问题一样,答案是取决于。 :)

绝对有可能提出一个场景,其中芹菜可以被两个独立的网站使用。如果多个站点正在向同一个交换机提交任务,并且任务不需要访问任何特定数据库 - 例如,它们使用电子邮件地址,信用卡号或数据库记录以外的其他数据 - 那么一个芹菜可能会足够了。只需确保任务代码位于由所有站点和芹菜服务器加载的共享模块中。

但是,通常情况下,您会发现芹菜需要访问数据库 - 它根据作为任务参数传递的ID加载对象,或者必须对数据库进行一些更改,或者通常,两者都是。并且多个站点/项目通常不共享数据库,即使它们共享相同的应用程序,因此您需要将任务队列分开。

在这种情况下,通常会发生的情况是您设置了一个具有多个交换的消息代理(例如RabbitMQ)。每个交换机都从单个站点接收消息。然后你在每个交易所的某个地方运行一个或多个celeryd进程(在celery配置设置中,你必须指定交换。我不相信celeryd可以收听多个交换)。每个celeryd服务器都知道它的交换,它应该加载的应用程序,以及它应该连接的数据库。

为了管理这些,我建议查看cyme - @asksol的内容,并在必要时在多台服务器上管理多个celeryd实例。我还没试过,但看起来它应该处理不同实例的不同配置。

答案 1 :(得分:1)

没有尝试使用不需要django-celery的Celery 3.1.x,根据文档,你可以像这样实例化一个Celery应用程序:

app1 = Celery('app1')

app1.config_from_object('django.conf:settings')
app1.autodiscover_tasks(lambda: settings.INSTALLED_APPS)


@app.task(bind=True)
def debug_task(self):
    print('Request: {0!r}'.format(self.request))

但是你可以使用celery multi来启动几个单独配置的工人,你可以看到例子here。因此,您可以使用不同的 --app appX 参数启动多个工作人员,以便使用不同的设置和设置:

# 3 workers: Two with 3 processes, and one with 10 processes.
$ celery multi start 3 -c 3 -c:1 10
celery worker -n celery1@myhost -c 10 --config celery1.py --app app1
celery worker -n celery2@myhost -c 3  --config celery2.py --app app2
celery worker -n celery3@myhost -c 3  --config celery3.py --app app3