【问题标题】:Using celeryd as a daemon with multiple django apps?使用 celeryd 作为多个 django 应用程序的守护进程?
【发布时间】:2012-04-19 18:23:14
【问题描述】:
我刚开始使用django-celery,我想将 celeryd 设置为守护进程运行。但是,instructions 似乎表明一次只能为一个站点/项目配置它。 celeryd 可以处理多个项目,还是只能处理一个?而且,如果是这种情况,是否有一种干净的方法可以将 celeryd 设置为为每个配置自动启动,这需要我为每个配置创建一个单独的 init 脚本?
【问题讨论】:
标签:
daemon
celery
django-celery
celeryd
【解决方案1】:
就像所有有趣的问题一样,答案是视情况而定。 :)
绝对有可能想出一个场景,两个独立的站点都可以使用 celeryd。如果多个站点正在向同一个交易所提交任务,并且这些任务不需要访问任何特定的数据库——例如,它们对电子邮件地址、信用卡号或数据库记录以外的其他东西进行操作——那么一个 celeryd 可能就足够了。只需确保任务代码位于所有站点和 celery 服务器加载的共享模块中即可。
不过,通常情况下,您会发现 celery 需要访问数据库——它要么根据作为任务参数传递的 ID 加载对象,要么必须将一些更改写入数据库,或者,大多数通常,两者兼而有之。并且多个站点/项目通常不共享数据库,即使它们共享相同的应用程序也是如此,因此您需要将任务队列分开。
在这种情况下,通常会发生的情况是您设置了具有多个交换的单个消息代理(例如 RabbitMQ)。每个交换从一个站点接收消息。然后你在某处为每个交换运行一个或多个 celeryd 进程(在 celery 配置设置中,你必须指定交换。我不相信 celeryd 可以监听多个交换)。每个 celeryd 服务器都知道它的交换、它应该加载的应用程序以及它应该连接到的数据库。
要管理这些,我建议查看cyme -- 它由@asksol 提供,并在必要时在多台服务器上管理多个 celeryd 实例。我没试过,但它看起来应该为不同的实例处理不同的配置。
【解决方案2】:
没有尝试但使用不需要 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