在django项目中常常需要有些耗时的任务,比如发送邮件、短信啥的,这种情况使用celery就非常有用了。celery有原生的也有第三方封装的django-celery,但是django-celery更新不及时,而且不支持celery4,这都出来两年了(看下commit 这两年半django-celery也没怎么提交新的代码), 如果你使用的是(<celery4.0)+(<=django1.8)可以考虑使用他否则请不要使用(2018.04.10是这样,当你看到的时候我不确定有没有更新,请自行决定)。由于我使用的是django1.11版本所以我只能使用原生的celery
官方文档
1.安装
pip install celery
2.broker,我这里使用的是redis,官方更推荐使用librabbitmq
pip install celery[redis]
3.django集成官方文档
4. 启动broker
celery -A <proj_name> worker -l info
我这里报错提示Celery ValueError: not enough values to unpack (expected 3, got 0)
在issue里有这个问题的解决办法
4.1 pip安装eventlet
pip install eventlet
4.2 启动参数
celery -A <proj_name> worker -l info -P eventlet
5.关于序列化方式
在celery3.x 默认的序列化方式是pickle,但在celery4.x已经变成了json,json更为通用 问题也少,但是却不能序列化字节码,我的需求中出现了字节码序列化的要求所以必须修改一下配置
CELERY_RESULT_SERIALIZER = 'pickle'
CELERY_TASK_SERIALIZER = 'pickle'
CELERY_ACCEPT_CONTENT = ['application/x-python-serialize']
- 关于结果的过期时间
如果线上项目不停的运行积累的任务结果也越来越多,肯定会撑爆redis,默认结果只会保存5000条,但是这不能完全满足我的需求 ,如果能设置过期时间就好了,issue上有个结果 但是经过测试无效