2

我目前设置了一个系统,它使用带有 redis 后端的 celery 来执行一堆异步任务,例如发送电子邮件、提取社交数据、爬行等。一切都很好,但我正在研究如何监控系统(也就是排队消息的数量)。我开始浏览 celery 源,但我想我会在这里发布我的问题:首先,这是我的配置:

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

我似乎找不到任务来获得排队的数量(从技术上讲,应该是 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 

如果有人可以为我解释这一点,那就太好了。

4

2 回答 2

9

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

CELERY_ALWAYS_EAGER

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

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

于 2012-02-09T02:31:50.860 回答
1

从未使用过 Celery,但如果您想弄清楚它在做什么,其中一种方法是使用 redis-cli 连接到 Redis 实例,然后运行monitor命令。这将转储针对 Redis 数据库执行的所有命令。您将能够确切地看到正在发生的事情。

于 2012-02-08T19:28:43.137 回答