20

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

4

2 回答 2

10

像所有有趣的问题一样,答案是视情况而定。:)

绝对有可能想出一个场景,其中 celeryd 可以被两个独立的站点使用。如果多个站点正在向同一个交易所提交任务,并且这些任务不需要访问任何特定的数据库——例如,它们对电子邮件地址、信用卡号或数据库记录以外的其他东西进行操作——那么一个 celeryd 可能就足够了。只需确保任务代码位于所有站点和 celery 服务器加载的共享模块中。

不过,通常情况下,您会发现 celery 需要访问数据库——它要么根据作为任务参数传递的 ID 加载对象,要么必须将一些更改写入数据库,或者大多数情况下,两者兼有. 并且多个站点/项目通常不共享数据库,即使它们共享相同的应用程序,因此您需要将任务队列分开。

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

为了管理这些,我建议研究cyme——它由@asksol 提供,并在必要时在多个服务器上管理多个 celeryd 实例。我没有尝试过,但它看起来应该为不同的实例处理不同的配置。

于 2012-10-11T17:50:43.250 回答
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 来启动多个具有单一配置的工作人员,您可以在此处查看示例。因此,您可以使用不同的--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
于 2014-10-09T19:44:14.487 回答