Celery3 迁移到 celery4 遇到的问题

来源:互联网 发布:千峰java在哪里 编辑:程序博客网 时间:2024/06/05 05:45

今天将老项目中的 celery3 更新到 celery4。出现了一些问题,这里做一个记录,方便以后查看。如果有人也遇到同样的问题,可以作为参考,少走弯路。

更新

最简单的更新方式当然是pip, ;)

pip install -U celery==4.1.0

遇到的问题

1. kombu.exceptions.EncodeError: Object of type 'Message' is not JSON serializable


我的任务函数的参数是一个自定义的对象实例,4.0版本默认是使用 JSON 序列化的,而 JSON 支持的类型有限,不包括自定义类实例。

解决
task_serializer设置成 pickle

2. celery.exceptions.ImproperlyConfigured


版本4对很多配置的名称进行了变更,所以更改配置名称就可以了

报错提示:

Cannot mix new and old setting keys, please rename thefollowing settings to the new format:CELERY_RESULT_BACKEND                -> result_backend

解决
CELERY_RESULT_BACKEND 配置名称修改为 result_backend

3. TypeError: can_read() got an unexpected keyword argument 'timeout'


这个问题不是celery 的问题,我项目里使用了redis作为消息中间件,这个问题是由于redis的版本问题导致的,我原来的版本是2.10.3,与celery4 不完全兼容。

解决

pip install -U redis==2.10.6

4. kombu.exceptions.ContentDisallowed: Refusing to deserialize untrusted content of type pickle (application/x-python-serialize)


默认情况下celery4不会接受pickle类型的消息,所以报这个错误

解决
accept_content 设置成 [‘pickle’] 就行了

原创粉丝点击