今天将老项目中的 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 the
following 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’] 就行了