django + celery 入门级总结

环境: system: windows 10
python: python2.7

1.RabbitMQ/Redis安装

由于想使用RabbitMQ做消息代理,Redis做结果存储。所以在网上查看安装教程,进行了安装。

1.1 redis安装

redis下载地址
下载完成直接安装即可,配置环境变量,将redis-cli.exe等可用命令所在的目录加入的path系统变量里面,方便我们以后再终端下直接使用命令。
测试安装

安装成功.png

1.2 下载安装RabbitMQ

由于安装RabbitMQ,会检测系统上是否安装了Erlang,所以如果系统未安装,就要先安装Erlang,然后再安装RabbitMQ。
Erlang下载地址
下载后安装,安装成功后配置环境变量

必须配置.png

RabbitMQ下载地址,安装也很简单。
安装完成后,打开RabbitMQ命令行终端(开始菜单里有)
image.png

直接执行./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 删除用户

浏览器管理页面.png

2.celery安装

pip install celery==3.1.25
由于刚开始直接pip install "celery[librabbitmq,redis,msgpack]",安装的celery是4.x的版本,在windows上运行,总是报错,后来在官网上看到了解释

image.png

3.新建一个django工程

比如我的目录结构


image.png

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

image.png

运行测试脚本,然后可以看到返回的结果

72c0456d-cc6b-4621-9575-85bbbaa7707b <class 'celery.result.AsyncResult'>
3 SUCCESS
image.png

4,常遇问题总结

4.1 ImportError: cannot import name Celery

这个问题遇到的不下三次,常说人不能在一个坑了栽倒三次,我是栽太多次了,所以记下来,方便以后再次遇到时,有可行的解决方案

标记处为解决方法.png

加上标记处的参数即可。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容