【发布时间】:2015-01-13 07:21:54
【问题描述】:
[先决条件]
- Django==1.5.8
- 芹菜==3.0.23
- django-celery==3.0.23
- amqp==1.4.6
[步骤]
- django views.py 通过 RabbitMQ 将消息发送到 celery 任务队列
- Celery 从队列中读取消息并按顺序执行任务
- 每个任务都不会花费很长时间
[问题]
- 前几次,celery 成功执行了任务,但队列中的任务数量没有减少(任务不断堆积在队列中)
- 最后,celery 在前几次之后没有从队列中执行任务
[提示]
- 我认为以下可能是解决问题的提示
- 前几次,任务执行良好,但没有从队列中删除
-
Task utils.tasks.do_things_1[027918df-a6ef-4712-a8c8-5b380d5bd0f6] succeeded in 1415464878.25s: None=> 为什么需要这么长时间?
[带日志的详细说明]
- 检查任务和工作人员的数量
$ sudo rabbitmqctl list_queues 命名消息消费者 | grep 芹菜
celery 0 0(0 个任务,0 个工人)
- 以调试模式启动时的 Celery 信息
$ ./manage.py celery worker --loglevel=debug
celery@75e28d96-1a33-4e08-8283-a31813a4124d v3.0.23 (Chiastic Slide)
Linux-3.2.0-34-generic-pae-i686-with-Ubuntu-14.04-trusty
[配置]
经纪人:amqp://guest@localhost:5672//
应用程序:默认值:0xb6b2188c (djcelery.loaders.DjangoLoader)
并发:1(进程)
事件:关闭(启用 -E 监控此工作人员)
[队列]
芹菜:交换:芹菜(直接)绑定:芹菜
[任务]
utils.tasks.do_things_1
utils.tasks.do_things_2
utils.tasks.do_things_3
[2014-11-16 14:09:13,769: DEBUG/MainProcess] [Worker] 加载模块。
[2014-11-16 14:09:13,771: DEBUG/MainProcess] [Worker] 声明组件。
[2014-11-16 14:09:13,771: DEBUG/MainProcess] [Worker] 构建启动步骤图。
[2014-11-16 14:09:13,772: DEBUG/MainProcess] [Worker] 新的启动顺序:{ev, queues, beat, pool, 调解器、自动重载器、计时器、状态数据库、自动缩放器、消费者}
[2014-11-16 14:09:13,774: DEBUG/MainProcess] 启动 celery.worker.hub.Hub...
[2014-11-16 14:09:13,774: DEBUG/MainProcess] celery.worker.hub.Hub OK!
[2014-11-16 14:09:13,774: DEBUG/MainProcess] 正在启动 celery.concurrency.processes.TaskPool...
[2014-11-16 14:09:13,782: DEBUG/MainProcess] celery.concurrency.processes.TaskPool OK!
[2014-11-16 14:09:13,787: DEBUG/MainProcess] 启动 celery.worker.mediator.Mediator...
[2014-11-16 14:09:13,788: DEBUG/MainProcess] celery.worker.mediator.Mediator OK!
[2014-11-16 14:09:13,788: DEBUG/MainProcess] 启动 celery.worker.consumer.Consumer...
[2014-11-16 14:09:13,789: WARNING/MainProcess] celery@75e28d96-1a33-4e08-8283-a31813a4124d 准备好了。
[2014-11-16 14:09:13,789: DEBUG/MainProcess] 消费者:重新建立与代理的连接...
[2014-11-16 14:09:13,800: DEBUG/MainProcess] 从服务器开始,版本:0.9,属性:{u'信息':u'在 MPL 下获得许可。见http://www.rabbitmq.com/', u'product': u'RabbitMQ', u'copyright': u'Copyright (C) 2007-2013 GoPivotal, Inc.', u'capabilities': {u'exchange_exchange_bindings': True, u 'connection.blocked':真,u'authentication_failure_close':真,u'basic.nack':真,u'consumer_priorities':真,u'consumer_cancel_notify':真,u'publisher_confirms':真},u'platform' : u'Erlang/OTP', u'version': u'3.2.4'}, 机制: [u'PLAIN', u'AMQPLAIN'], locales: [u'en_US']
[2014-11-16 14:09:13,801: DEBUG/MainProcess] 打开OK!
[2014-11-16 14:09:13,801: INFO/MainProcess] 消费者:连接到 amqp://guest@127.0.0.1:5672//。
[2014-11-16 14:09:13,802: DEBUG/MainProcess] 使用 channel_id: 1
[2014-11-16 14:09:13,803: DEBUG/MainProcess] 通道打开
[2014-11-16 14:09:13,804: DEBUG/MainProcess] 消费者:basic.qos: prefetch_count->4
[2014-11-16 14:09:13,805: DEBUG/MainProcess] 使用 channel_id: 2
[2014-11-16 14:09:13,805: DEBUG/MainProcess] 通道打开
[2014-11-16 14:09:13,812: DEBUG/MainProcess] 消费者:准备接受任务!
- 检查任务和工作人员的数量
$ sudo rabbitmqctl list_queues 命名消息消费者 | grep 芹菜
celery 0 1(0 个任务,1 个工人)
- views.py 中发生了一些事件并发送消息以执行 do_things_1、do_things_2、do_things_3(第一次尝试)
[2014-11-16 14:53:51,874: INFO/MainProcess] 从代理获得任务:utils.tasks。do_things_1[027918df-a6ef-4712-a8c8-5b380d5bd0f6] eta:[ 2014-11-16 14:53:52.835084+09:00]
[2014-11-16 14:53:51,875: INFO/MainProcess] 从代理获得任务:utils.tasks。do_things_2[a1c09645-32fb-4399-802b-60ca826fa6bc] eta:[ 2014-11-16 14:53:52.851516+09:00]
[2014-11-16 14:53:51,880: INFO/MainProcess] 从代理获得任务:utils.tasks。do_things_3[5a66f885-baf2-49ab-b82f-733d2b68fe7b] eta:[ 2014-11-16 14:53:52.852527+09:00]
[2014-11-16 14:53:51,880: DEBUG/MainProcess] 消费者:basic.qos:prefetch_count->7
[2014-11-16 14:53:52,882: DEBUG/MainProcess] 消费者:basic.qos:prefetch_count->4
[2014-11-16 14:53:52,917: DEBUG/MainProcess] 中介:为任务运行回调:utils.tasks。do_things_1[027918df-a6ef-4712-a8c8-5b380d5bd0f6]
[2014-11-16 14:53:52,918: DEBUG/MainProcess] TaskPool: Apply (args:('utils.tasks.do_things_1', '027918df-a6ef-4712-a8c8- 5b380d5bd0f6', [u'0301010101', u'1'], {}, {'utc': True, 'is_eager': False, 'chord': None, 'group': None, 'args': [u' 0301010101', u'1'], 'retries': 0, 'delivery_info': {'priority': None, 'routing_key': u'celery', 'exchange': u'celery'}, 'expires': None ,'任务':'utils.tasks.do_things_1','回调':无,'errbacks':无,'主机名':'******************** ****', 'taskset': 无, 'kwargs': {}, 'eta': '2014-11-16T05:53:52.835084', 'id': '027918df-a6ef-4712-a8c8-5b380d5bd0f6' }) kwargs:{})
[2014-11-16 14:53:52,918: DEBUG/MainProcess] 中介:为任务运行回调:utils.tasks。do_things_2[a1c09645-32fb-4399-802b-60ca826fa6bc]
[2014-11-16 14:53:52,918: DEBUG/MainProcess] TaskPool: Apply (args:('utils.tasks.do_things_2', 'a1c09645-32fb-4399-802b- 60ca826fa6bc', [u'0301010101', u'1'], {}, {'utc': True, 'is_eager': False, 'chord': None, 'group': None, 'args': [u' 0301010101', u'1'], 'retries': 0, 'delivery_info': {'priority': None, 'routing_key': u'celery', 'exchange': u'celery'}, 'expires': None ,'任务':'utils.tasks.do_things_2','回调':无,'errbacks':无,'主机名':'******************** *', 'taskset': 无, 'kwargs': {}, 'eta': '2014-11-16T05:53:52.851516', 'id': 'a1c09645-32fb-4399-802b-60ca826fa6bc'}) kwargs :{})
[2014-11-16 14:53:52,918: DEBUG/MainProcess] 中介:为任务运行回调:utils.tasks。do_things_3[5a66f885-baf2-49ab-b82f-733d2b68fe7b]
[2014-11-16 14:53:52,918: DEBUG/MainProcess] TaskPool: Apply (args:('utils.tasks.do_things_3', '5a66f885-baf2-49ab-b82f- 733d2b68fe7b', [u'0301010101', u'1', u'1'], {}, {'utc': True, 'is_eager': False, 'chord': None, 'group': None, 'args ': [u'0301010101', u'1', u'1'], 'retries': 0, 'delivery_info': {'priority': None, 'routing_key': u'celery', 'exchange': u '芹菜'},'过期':无,'任务':'utils.tasks.do_things_3','回调':无,'errbacks':无,'主机名':'********** ***************','taskset':无,'kwargs':{},'eta':'2014-11-16T05:53:52.852527','id': '5a66f885-baf2-49ab-b82f-733d2b68fe7b'}) kwargs:{})
我检查了 do_things_1、do_thins_2、do_things_3 在浏览器中执行良好
检查任务和worker的数量 (可以看到,任务没有从队列中减少)
$ sudo rabbitmqctl list_queues 命名消息消费者 | grep 芹菜
celery 3 1(3 个任务,1 个工人)
- 重复以执行do_things_1、do_things_2、do_things_3(第二次尝试)
[2014-11-16 15:27:54,060: DEBUG/MainProcess] 任务接受:utils.tasks.do_things_1[027918df-a6ef-4712-a8c8-5b380d5bd0f6] pid:23793 p>
[2014-11-16 15:27:54,060: INFO/MainProcess] 从代理获得任务:utils.tasks。do_things_1[2ea06e92-c617-460e-9275-98d4c4f79394] eta:[ 2014-11-16 15:27:55.048622+09:00]
[2014-11-16 15:27:54,060: DEBUG/MainProcess] 消费者:basic.qos:prefetch_count->5
[2014-11-16 15:27:54,063: INFO/MainProcess] 任务 utils.tasks.do_things_1[027918df-a6ef-4712-a8c8-5b380d5bd0f6] 在 1415464878.25s 成功:无
[2014-11-16 15:27:54,063: INFO/MainProcess] 从代理获得任务:utils.tasks。do_things_2[cad7b687-7ef6-4f99-a06e-4a038369837d] eta:[ 2014-11-16 15:27:55.061913+09:00]
[2014-11-16 15:27:54,063: DEBUG/MainProcess] 消费者:basic.qos:prefetch_count->6
[2014-11-16 15:27:54,065: DEBUG/MainProcess] 已接受任务:utils.tasks.do_things_2[a1c09645-32fb-4399-802b-60ca826fa6bc] pid:23793
[2014-11-16 15:27:54,066: INFO/MainProcess] 从代理获得任务:utils.tasks。do_things_3[ceee2b27-5cc0-45cc-9a00-e15a361fa92f] eta:[ 2014-11-16 15:27:55.064312+09:00]
[2014-11-16 15:27:54,066: DEBUG/MainProcess] 消费者:basic.qos:prefetch_count->7
[2014-11-16 15:27:55,068: DEBUG/MainProcess] 消费者:basic.qos:prefetch_count->4
[2014-11-16 15:27:55,101: DEBUG/MainProcess] 中介:为任务运行回调:utils.tasks。do_things_1[2ea06e92-c617-460e-9275-98d4c4f79394]
[2014-11-16 15:27:55,101: DEBUG/MainProcess] TaskPool: Apply (args:('utils.tasks.do_things_1', '2ea06e92-c617-460e-9275- 98d4c4f79394', [u'0301010101', u'1'], {}, {'utc': True, 'is_eager': False, 'chord': None, 'group': None, 'args': [u' 0301010101', u'1'], 'retries': 0, 'delivery_info': {'priority': None, 'routing_key': u'celery', 'exchange': u'celery'}, 'expires': None ,'任务':'utils.tasks.do_things_1','回调':无,'errbacks':无,'主机名':'******************** **********', 'taskset': 无, 'kwargs': {}, 'eta': '2014-11-16T06:27:55.048622', 'id': '2ea06e92-c617- 460e-9275-98d4c4f79394'}) kwargs:{})
[2014-11-16 15:27:55,105: DEBUG/MainProcess] 中介:为任务运行回调:utils.tasks。do_things_2[cad7b687-7ef6-4f99-a06e-4a038369837d]
[2014-11-16 15:27:55,105: DEBUG/MainProcess] TaskPool: Apply (args:('utils.tasks.do_things_2', 'cad7b687-7ef6-4f99-a06e- 4a038369837d', [u'0301010101', u'1'], {}, {'utc': True, 'is_eager': False, 'chord': None, 'group': None, 'args': [u' 0301010101', u'1'], 'retries': 0, 'delivery_info': {'priority': None, 'routing_key': u'celery', 'exchange': u'celery'}, 'expires': None ,'任务':'utils.tasks.do_things_2','回调':无,'errbacks':无,'主机名':'******************** *****','taskset':无,'kwargs':{},'eta':'2014-11-16T06:27:55.061913','id':'cad7b687-7ef6-4f99-a06e-4a038369837d '}) kwargs:{})
[2014-11-16 15:27:55,105: DEBUG/MainProcess] 中介:为任务运行回调:utils.tasks。do_things_3[ceee2b27-5cc0-45cc-9a00-e15a361fa92f]
[2014-11-16 15:27:55,106: DEBUG/MainProcess] TaskPool: Apply (args:('utils.tasks.do_things_3', 'ceee2b27-5cc0-45cc-9a00- e15a361fa92f', [u'0301010101', u'1', u'1'], {}, {'utc': True, 'is_eager': False, 'chord': None, 'group': None, 'args ': [u'0301010101', u'1', u'1'], 'retries': 0, 'delivery_info': {'priority': None, 'routing_key': u'celery', 'exchange': u '芹菜'},'过期':无,'任务':'utils.tasks.do_things_3','回调':无,'errbacks':无,'主机名':'********** *********************','taskset':无,'kwargs':{},'eta':'2014-11-16T06:27:55.064312 ', 'id': 'ceee2b27-5cc0-45cc-9a00-e15a361fa92f'}) kwargs:{})
我检查了 do_things_1、do_thins_2、do_things_3 在浏览器中执行良好
检查任务和工人的数量 (如您所见,任务减少了部分)
$ sudo rabbitmqctl list_queues 命名消息消费者 | grep 芹菜
celery 4 1(4 个任务,1 个工人)
重复以执行 do_things_1、do_things_2、do_things_3(第三次尝试)
Celery 没有记录任何内容,并且 do_things_1、do_thins_2、do_things_3 未执行!
检查任务和工人的数量 (可以看到,任务增加了)
$ sudo rabbitmqctl list_queues 命名消息消费者 | grep 芹菜
celery 7 1(7 个任务,1 个工人)
- 当我通过“Ctrl+C”终止它时,它会记录如下
celeryd:热关机(MainProcess)
[2014-11-16 16:15:52,922: DEBUG/MainProcess] 停止 celery.worker.consumer.Consumer...
[2014-11-16 16:15:52,923: DEBUG/MainProcess] 消费者:停止消费者...
[2014-11-16 16:15:52,923: DEBUG/MainProcess] 停止 celery.worker.mediator.Mediator...
[2014-11-16 16:15:53,638: DEBUG/MainProcess] 停止 celery.concurrency.processes.TaskPool...
[2014-11-16 16:15:53,638: INFO/MainProcess] 任务 utils.tasks.do_things_2[a1c09645-32fb-4399-802b-60ca826fa6bc] 1415467757.76s 成功:无
[2014-11-16 16:15:53,639: DEBUG/MainProcess] 已接受任务:utils.tasks.do_things_3[5a66f885-baf2-49ab-b82f-733d2b68fe7b] pid:23793
[2014-11-16 16:15:53,639: INFO/MainProcess] 任务 utils.tasks.do_things_3[5a66f885-baf2-49ab-b82f-733d2b68fe7b] 在 1415467757.75s 成功:无
[2014-11-16 16:15:53,640: DEBUG/MainProcess] 已接受任务:utils.tasks.do_things_1[2ea06e92-c617-460e-9275-98d4c4f79394] pid:23793
[2014-11-16 16:15:53,640: INFO/MainProcess] 任务 utils.tasks.do_things_1[2ea06e92-c617-460e-9275-98d4c4f79394] 在 1415465715.65s 成功:无
[2014-11-16 16:15:53,640: DEBUG/MainProcess] 已接受任务:utils.tasks.do_things_2[cad7b687-7ef6-4f99-a06e-4a038369837d] pid:23793
[2014-11-16 16:15:53,641: INFO/MainProcess] Task utils.tasks.do_things_2[cad7b687-7ef6-4f99-a06e-4a038369837d] 1415465715.64s 成功:无
[2014-11-16 16:15:53,641: DEBUG/MainProcess] 已接受任务:utils.tasks.do_things_3[ceee2b27-5cc0-45cc-9a00-e15a361fa92f] pid:23793 p>
[2014-11-16 16:15:53,642: INFO/MainProcess] 任务 utils.tasks.update_apartboard_1st_load_page_cache[ceee2b27-5cc0-45cc-9a00-e15a361fa92f] 在 1415465715.63s 中成功:无
do_things_1、do_things_2、do_things_3 未执行(从浏览器检查)
检查任务和worker的数量 (可以看到,任务从队列中减少了)
$ sudo rabbitmqctl list_queues 命名消息消费者 | grep 芹菜
celery 3 0(3 个任务,0 个工人)
- 清除任务队列
$ ./manage.py celeryctl purge
$ sudo rabbitmqctl list_queues 命名消息消费者 | grep 芹菜
celery 0 0(0 个任务,0 个工人)
【问题讨论】:
标签: django celery django-celery