45IT.COM- 电脑学习从此开始!
DIY硬件教程攒机经验装机配置
设计Photoshop网页设计特效
系统注册表DOS系统命令其它
存储主板显卡外设键鼠内存
维修显卡CPU内存打印机
WinXPVistaWin7unix/linux
CPU光驱电源/散热显示器其它
修技主板硬盘键鼠显示器光驱
办公ExcelWordPowerPointWPS
编程数据库CSS脚本PHP
网络局域网QQ服务器
软件网络系统图像安全
页面导航: 首页 > 设计学院 > 网络编程 > PHP教程 >

celery worker错误”Received unregistered task of type ‘tasks.add’”解决

电脑软硬件应用网 45IT.COM 时间:2015-03-09 12:22 作者:佚名
在Python开发的分布式任务调度模块celery的worker出现 Received unregistered task of type tasks.add错误,下面是本人的解决方法。 试玩了一下celery的priodic task,后来遇到了Received unregistered task of type
在Python开发的分布式任务调度模块celery的worker出现 ”Received unregistered task of type ‘tasks.add’”错误,下面是本人的解决方法。

试玩了一下celery的priodic task,后来遇到了”Received unregistered task of type ‘tasks.add’”的错误,排查这个问题过程有点tricky,记录一下.

错误提示为:

代码如下  
[2014-08-30 04:34:14,913: ERROR/MainProcess] Received unregistered task of type 'tasks.add'.
The message has been ignored and discarded.

Did you remember to import the module containing this task?
Or maybe you are using relative imports?
Please see http://bit.ly/gLye1c for more information.

The full contents of the message body was:
{'retries': 0, 'task': 'tasks.add', 'utc': False, 'args': (4, 4), 'expires': None, 'eta': None, 'kwargs': {}, 'id': '841bc21f-8124-436b-92f1-e3b62cafdfe7'}

Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/celery/worker/consumer.py", line 444, in receive_message
self.strategies[name](message, body, message.ack_log_error)
KeyError: 'tasks.add'


这个错误信息提示的再明显不过了,一看就知道是什么问题. 但是在排查问题过程中,我思路比较僵化,一直认为时rabbitmq那边一直有消息没有被消费. 甚至后来还删除了RabbitMQ上的所有queue和message, 还重装了rabbitmq-server软件; 同时,还用一些工具去做Celery和RabbitMQ的monitoring. 也都没解决问题.

以为我本地没有再产生这样的新消息了啊,怎么rabbitmq中的消息一直都有呢?

后来的后来,我才发现,我本地的最开始配置priodic task的beat进程并没有完全推出,似乎我时用ctrl+c去结束掉主进程的,后来居然观察到其子进程并没有推出,还在继续运行,所以那个名为tasks.add的task还在按照10s的间隔运行,而我的worker代码中已经修改或删除了处理的task,所以worker并不能处理tasks.add这个任务,所以报了上面的错误.

另外, 最开始第一次出现这个错误的根本原因是,在使用priodic task时调用的是”tasks.add”,而celery worker这边可用的task其实是aew.tasks.add, 这个就时任务名称的配置问题. 可以用”celery -A aew inspect registered”命令(其中aew时我自己demo用的APP)去查看该APP中的所有注册了的task.

教训主要有两点:

1. 运行celery,进程退出后,要check一下子进程是否仍在运行.

2. 在配置priodic task时要确保task全名是在inspect registered中查到的注册了的任务, 要保持一致,否则worker无法执行这些任务.

顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
验证码:点击我更换图片
推荐知识