python之celery使用详解一
前言
前段时间需要使用rabbitmq做写缓存,一直使用pika+rabbitmq的组合,pika这个模块虽然可以很直观地操作rabbitmq,但是官方给的例子太简单,对其底层原理了解又不是很深,遇到很多坑,尤其是需要自己写连接池管理和channel池管理。虽然也有用过celery,一直也是celery+redis的组合,涉及很浅;目前打算深研一下celery+redis+rabbitmq的使用。
连接
本次使用Redis连接
- 连接Redis
连接Redis
使用redis 存储对象,celery 会将信息存储到Redis
1. 首先创建 tasks.py:
from celery import Celery, platforms
platforms.C_FORCE_ROOT = True #加上这一行
# 使用账户密码
# redis://username:passwd@ip:6390/db
# 只填密码
# redis://:password@127.0.0.1:6379/2
broker = 'redis://:123456@127.0.0.1:6379/1'
backend = ''
app = Celery('tasks', broker=broker)
@app.task
def add(x, y):
return x + y
用root用户连接,需加上platforms.C_FORCE_ROOT = True
python3.7 不兼容celery 版本4.0
2.运行 Celery 职程(Worker)服务
celery -A task文件 worker --loglevel=info
例如:
celery -A tasks worker --loglevel=info
3.
>>> from tasks import add
>>> add.delay(4, 4)
调用任务会返回一个 AsyncResult 的实例,用于检测任务的状态,等待任务完成获取返回值(如果任务执行失败,会抛出异常)。
- ready()
可以检测是否已经处理完毕: -
r.ready() # 返回布尔值, 任务执行完成, 返回 True, 否则返回 False.
r.wait() # 等待任务完成, 返回任务执行结果.
r.get() # 获取任务执行结果
r.result # 任务执行结果.
r.state # PENDING, START, SUCCESS
r.status # PENDING, START, SUCCESS