2012-04-19 51 views
17

我刚开始使用django-celery,我想将celeryd作为守护进程运行。但是,instructions似乎暗示它一次只能配置一个站点/项目。芹菜可以处理多个项目,还是只能处理一个项目?而且,如果是这种情况,是否有一种简洁的方法来设置芹菜以便为每个配置自动启动,这要求我为每个配置创建一个单独的初始化脚本?使用celeryd作为一个守护进程与多个Django应用程序?

回答

8

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

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

虽然你会发现celery需要访问数据库 - 它可以根据作为任务参数传递的ID加载对象,或者必须对数据库写入一些更改,或者,最常见的是两者。多个网站/项目通常不共享数据库,即使它们共享相同的应用程序,因此您需要将任务队列分开。

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

为了管理这些,我建议您查看cyme - 它是通过@asksol,并在多个服务器上管理多个celeryd实例(如有必要)。我没有尝试,但它看起来应该处理不同实例的不同配置。

1

没试过,但使用3.1.X芹菜它不需要Django的芹菜,根据文档,您可以实例化一个芹菜应用程序是这样的:

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)) 

但是你可以使用芹菜多了几下水每个工作人员都有单一配置,您可以看到示例here。所以,你可以启动几个工人用不同--app APPX参数,所以它会使用不同的TAKS和设置:

# 3 workers: Two with 3 processes, and one with 10 processes. 
$ celery multi start 3 -c 3 -c:1 10 
celery worker -n [email protected] -c 10 --config celery1.py --app app1 
celery worker -n [email protected] -c 3 --config celery2.py --app app2 
celery worker -n [email protected] -c 3 --config celery3.py --app app3 
相关问题