2012-02-08 40 views
2

我有一个系统设置当前使用芹菜和redis 后端来完成一堆异步任务,比如发送电子邮件,提取社交数据,抓取等。一切都很好,但我 我正在组搞清楚如何监视系统(也就是队列消息的号码 )。我开始寻找通过芹菜源,但 我想我会在这里发表我的问题: 首先,这里是我的配置:Celery&Redis Backend的问题

BROKER_BACKEND     = "redis" 
BROKER_HOST      = "localhost" 
BROKER_PORT      = 6379 
BROKER_VHOST     = "1" 
REDIS_CONNECT_RETRY  = True 
REDIS_HOST        = "localhost" 
REDIS_PORT        = 6379 
REDIS_DB        = "0" 
CELERY_SEND_EVENTS      = True 
CELERYD_LOG_LEVEL    = 'INFO' 
CELERY_RESULT_BACKEND   = "redis" 
CELERY_TASK_RESULT_EXPIRES  = 25 
CELERYD_CONCURRENCY    = 8 
CELERYD_MAX_TASKS_PER_CHILD = 10 
CELERY_ALWAYS_EAGER      =True 

我试图做的第一件事是监视多少消息在 我的队列中。我假设,在幕后,redis后端只是从列表中弹出/弹出 ,尽管我似乎无法在 中找到代码。所以我模拟了一个模拟,其中我开始执行大约100个任务,而 正试图在redis中找到它们: 我的celeryd正在运行,如下所示: python manage.py celeryd -c 4 --loglevel = DEBUG -n XXXXX --logfile = logs/ celery.log 所以我应该只有4个并发工作者一次..... 两件事我不明白: 问题1: 我排队了100个任务后,在redis上查找它们,我只 看到以下内容:

$ redis-cli 
redis 127.0.0.1:6379> keys * 
1) "_kombu.binding.celery" 
redis 127.0.0.1:6379> select 1 
OK 
redis 127.0.0.1:6379[1]> keys * 
1) "_kombu.binding.celery" 
2) "_kombu.binding.celeryd.pidbox" 
redis 127.0.0.1:6379[1]> 

我似乎无法找到任务得到了许多有多少人排队 (T echnically,96应该是因为我只支持4个并行任务)

问题2

$ ps aux | grep celeryd | cut -c 13-120 
41258 0.2 0.2 2526232 9440 s004 S+ 2:27PM 0:07.35 python 
manage.py celeryd -c 4 --loglevel=DEBU 
41261 0.0 0.1 2458320 2468 s004 S+ 2:27PM 0:00.09 python 
manage.py celeryd -c 4 --loglevel=DEBU 
38457 0.0 0.8 2559848 34672 s004 T 12:34PM 0:18.59 python 
manage.py celeryd -c 4 --loglevel=INFO 
38449 0.0 0.9 2517244 36752 s004 T 12:34PM 0:35.72 python 
manage.py celeryd -c 4 --loglevel=INFO 
38443 0.0 0.2 2524136 6456 s004 T 12:34PM 0:10.15 python 
manage.py celeryd -c 4 --loglevel=INFO 
84542 0.0 0.0 2460112  4 s000 T 27Jan12 0:00.74 python 
manage.py celeryd -c 4 --loglevel=INFO 
84536 0.0 0.0 2506728  4 s000 T 27Jan12 0:00.51 python 
manage.py celeryd -c 4 --loglevel=INFO 
41485 0.0 0.0 2435120 564 s000 S+ 2:54PM 0:00.00 grep 
celeryd 
41264 0.0 0.1 2458320 2480 s004 S+ 2:27PM 0:00.09 python 
manage.py celeryd -c 4 --loglevel=DEBU 
41263 0.0 0.1 2458320 2480 s004 S+ 2:27PM 0:00.09 python 
manage.py celeryd -c 4 --loglevel=DEBU 
41262 0.0 0.1 2458320 2480 s004 S+ 2:27PM 0:00.09 python 
manage.py celeryd -c 4 --loglevel=DEBU 

如果有人可以解释这对我来说,这将是巨大的。

回答

9

您的配置有CELERY_ALWAYS_EAGER = True。这意味着任务在本地运行,因此您不会在Redis中看到它们。从文档:http://celery.readthedocs.org/en/latest/configuration.html#celery-always-eager

CELERY_ALWAYS_EAGER

如果这是真的,所有的任务将在本地通过阻断,直到任务返回执行 。 apply_async()和 Task.delay()将返回一个EagerResult实例,该实例模拟 API和AsyncResult的行为,除了结果已经被 评估。

也就是说,任务将在本地执行而不是发送到 队列。

1

从未使用过Celery,但如果您想知道它在做什么,可以使用redis-cli连接到Redis实例,然后运行monitor命令。这会将所有正在执行的命令转储到Redis数据库。你将能够看到究竟发生了什么。