django+celery实现异步任务

在django项目中经常须要有些耗时的任务,好比发送邮件、短信啥的,这种状况使用celery就很是有用了。celery有原生的也有第三方封装的django-celery,可是django-celery更新不及时,并且不支持celery4,这都出来两年了(看下commit 这两年半django-celery也没怎么提交新的代码), 若是你使用的是(<celery4.0)+(<=django1.8)能够考虑使用他不然请不要使用(2018.04.10是这样,当你看到的时候我不肯定有没有更新,请自行决定)。因为我使用的是django1.11版本因此我只能使用原生的celery
官方文档
1.安装html

pip install celery

2.broker,我这里使用的是redis,官方更推荐使用librabbitmqpython

pip install celery[redis]

3.django集成官方文档git

  1. 启动broker
celery -A <proj_name> worker -l info

我这里报错提示Celery ValueError: not enough values to unpack (expected 3, got 0)
issue里有这个问题的解决办法
4.1 pip安装eventletgithub

pip install eventlet

4.2 启动参数redis

celery -A <proj_name> worker -l info -P eventlet

5.关于序列化方式
在celery3.x 默认的序列化方式是pickle,但在celery4.x已经变成了json,json更为通用 问题也少,可是却不能序列化字节码,个人需求中出现了字节码序列化的要求因此必须修改一下配置django

CELERY_RESULT_SERIALIZER = 'pickle'
CELERY_TASK_SERIALIZER = 'pickle'
CELERY_ACCEPT_CONTENT = ['application/x-python-serialize']
  1. 关于结果的过时时间
    若是线上项目不停的运行积累的任务结果也愈来愈多,确定会撑爆redis,默认结果只会保存5000条,可是这不能彻底知足个人需求 ,若是能设置过时时间就行了,issue上有个结果 可是通过测试无效

celery的所有配置项json