2

我对 Django==1.5 上的 celery==3.0.23 有一些问题,

让我把大家放在上下文中,我使用 Celery 和 RabbitMQ 作为消息代理来维护我的 django 项目中的异步任务队列,因为它们涉及与远程服务的太多交互,无法在线完成。

这是我的 settings.py 中的 django-celery 配置,我的 INSTALLED_APPS 元组中也有 celery 和 djcelery

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 中定义了一些方法,并按照芹菜文档中的说明调用了这些方法:

方法.延迟(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 版本上非常常见的问题,并且已解决芹菜 3.0

任何人都可以告诉我这个吗?

非常感谢您花时间阅读和帮助。

4

2 回答 2

4

通常,将 Django 查询集对象或像 User 这样的惰性评估对象传递给 Celery 任务并不是一个好主意,因为它们不能很好地序列化。我建议通过仅传递用户名字符串然后在 celery 任务中再次查询该用户的数据库来简化您发送的内容。

于 2013-09-25T17:05:20.643 回答
0

您可以尝试在发出日志的 py 文件的开头添加以下代码。

import sys
reload(sys)
sys.setdefaultencoding('utf8')
于 2019-11-29T07:42:36.237 回答