我在Django == 1.5,
上有一些celery == 3.0.23的问题让我把你们全部放在上下文中,我使用Celery和RabbitMQ作为消息代理 在我的django项目中维护一个异步任务队列,因为它们涉及与远程服务的过多交互以在线完成。
这是我的settings.py中的django-celery配置,我也有芹菜和djcelery 在我的INSTALLED_APPS元组中
import djcelery
BROKER_URL = 'amqp://guest:guest@localhost:5672'
CELERY_ROUTES = {
'users.tasks.sync_messages': {'queue': 'cron'},
'users.tasks.update_balance': {'queue': 'cron'},
'profiles.tasks.*': {'queue': 'job'}
}
CELERYBEAT_SCHEDULE = {
'sync-messages': {
'task': 'users.tasks.sync_messages',
'schedule': crontab(minute='*/4'),
},
'update-balance': {
'task': 'users.tasks.update_balance',
'schedule': crontab(minute='*/5'),
},
}
(我也有一些预定的工作)
我在profiles.helpers中定义了一些方法,我调用了这个方法 正如芹菜文档中所解释的那样:
method.delay(arg1,arg2 ...)
并且由于UnicodeDecodeError
而拒绝该作业我用-l DEBUG选项运行celeryd,这是我尝试时的输出 排队工作:
[2013-09-13 17:19:56,108: DEBUG/MainProcess] consumer: Ready to accept tasks!
[2013-09-13 17:21:13,970: WARNING/MainProcess] Traceback (most recent call last):
[2013-09-13 17:21:13,970: WARNING/MainProcess] File "/usr/lib/python2.7/logging/__init__.py", line 851, in emit
[2013-09-13 17:21:14,020: WARNING/MainProcess] msg = self.format(record)
[2013-09-13 17:21:14,021: WARNING/MainProcess] File "/usr/lib/python2.7/logging/__init__.py", line 724, in format
[2013-09-13 17:21:14,021: WARNING/MainProcess] return fmt.format(record)
[2013-09-13 17:21:14,021: WARNING/MainProcess] File "/home/israelord/.virtualenvs/ringtu/local/lib/python2.7/site-packages/celery/utils/log.py", line 110, in format
[2013-09-13 17:21:14,041: WARNING/MainProcess] return safe_str(logging.Formatter.format(self, record))
[2013-09-13 17:21:14,041: WARNING/MainProcess] File "/usr/lib/python2.7/logging/__init__.py", line 464, in format
[2013-09-13 17:21:14,041: WARNING/MainProcess] record.message = record.getMessage()
[2013-09-13 17:21:14,041: WARNING/MainProcess] File "/usr/lib/python2.7/logging/__init__.py", line 328, in getMessage
[2013-09-13 17:21:14,042: WARNING/MainProcess] msg = msg % self.args
[2013-09-13 17:21:14,042: WARNING/MainProcess] UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 58: ordinal not in range(128)
[2013-09-13 17:21:14,042: WARNING/MainProcess] Logged from file consumer.py, line 589
我知道这里没有太多信息,但我不知道如何调试这个
我认为这与Celery如何序列化任务有关,但我尝试了几个序列化程序 得到了相同的结果,我正在阅读一些博客文章,发现这是一个非常常见的问题Celery< 3.0版本,并在Celery 3.0上解决了
有人可以告诉我这个吗?
非常感谢您花时间阅读和帮助。
答案 0 :(得分:4)
通常,将Django查询集对象或懒惰评估的对象(如User)传递给Celery任务并不是一个好主意,因为它们不能很好地序列化。我建议只通过传递用户名字符串来简化你发送的内容,然后在芹菜任务中再次查询该用户的数据库。
答案 1 :(得分:0)
您可以尝试在发出日志的py文件的开头添加以下代码。
import sys
reload(sys)
sys.setdefaultencoding('utf8')