环境: system: windows 10
python: python2.7
1.RabbitMQ/Redis安装
由于想使用RabbitMQ做消息代理,Redis做结果存储。所以在网上查看安装教程,进行了安装。
1.1 redis安装
redis下载地址
下载完成直接安装即可,配置环境变量,将redis-cli.exe等可用命令所在的目录加入的path系统变量里面,方便我们以后再终端下直接使用命令。
测试安装
1.2 下载安装RabbitMQ
由于安装RabbitMQ,会检测系统上是否安装了Erlang,所以如果系统未安装,就要先安装Erlang,然后再安装RabbitMQ。
Erlang下载地址
下载后安装,安装成功后配置环境变量
RabbitMQ下载地址,安装也很简单。
安装完成后,打开RabbitMQ命令行终端(开始菜单里有)
直接执行
./rabbitmq-plugins enable rabbitmq_management
可以开启web管理。访问
http://192.168.9.102:15672/
(本地地址+15672端口号)用户名密码默认都是guest,如果你想增加用户,后者修改密码,都可以在命令行中执行相关命令:
rabbitmqctl change_password userName newPassword
修改密码rabbitmqctl.bat add_user username password
新增用户rabbitmqctl.bat list_users
查看用户及角色rabbitmqctl.bat set_user_tags username administrator
修改用户角色rabbitmqctl.bat delete_user username
删除用户
2.celery安装
pip install celery==3.1.25
由于刚开始直接pip install "celery[librabbitmq,redis,msgpack]"
,安装的celery是4.x的版本,在windows上运行,总是报错,后来在官网上看到了解释
3.新建一个django工程
比如我的目录结构
3.1celeryconfig.py文件内容(参考豆瓣大神的资料)
BROKER_URL = 'amqp://guest@localhost//' # 使用RabbitMQ作为消息代理
CELERY_RESULT_BACKEND = 'redis://localhost:6379/0' # 把任务结果存在了Redis
CELERY_TASK_SERIALIZER = 'msgpack' # 任务序列化和反序列化使用msgpack方案
CELERY_RESULT_SERIALIZER = 'json' # 读取任务结果一般性能要求不高,所以使用了可读性更好的JSON
CELERY_TASK_RESULT_EXPIRES = 60 * 60 * 24 # 任务过期时间,不建议直接写86400,应该让这样的magic数字表述更明显
CELERY_ACCEPT_CONTENT = ['json', 'msgpack'] # 指定接受的内容类型
3.2 celery_app.py
from celery import Celery
app = Celery('celery_demo', include=['celery_demo.tasks'])
app.config_from_object('celery_demo.celeryconfig')
if __name__ == '__main__':
app.start()
3.3 task.py
from celery_demo.celery_app import app
@app.task
def add(x, y):
return x + y
3.4 test.py
from celery_demo.tasks import add
if __name__ == '__main__':
rlt = add.delay(1, 2)
print rlt, type(rlt)
print rlt.get(), rlt.status
启动celery:celery -A celery_demo worker --app=celery_demo.celery_app:app -l info
运行测试脚本,然后可以看到返回的结果
72c0456d-cc6b-4621-9575-85bbbaa7707b <class 'celery.result.AsyncResult'>
3 SUCCESS
4,常遇问题总结
4.1 ImportError: cannot import name Celery
这个问题遇到的不下三次,常说人不能在一个坑了栽倒三次,我是栽太多次了,所以记下来,方便以后再次遇到时,有可行的解决方案
加上标记处的参数即可。