Celery入门
Celery是一个可以处理大量消息的分布式系统,是一个关注于实时进程的任务队列,同时也支持任务时间表。
Celery经由消息进行交流,经常使用一个broker在client和worker之间调解。初始化一个任务,client添加一个消息到队列中,broker将消息传递给worker。
选择Broker
Broker:消息枢纽
常用的有两种:
- RabbitMQ
- Redis
(他们的安装与配置可以查看相应的文档)
安装Celery
pip install celery
第一个应用
# tasks.py
from celery import Celery
# celery在使用前必须要实例化,实例化后被称为应用(app)
app = Celery('tasks',broker='amqp://guest@localhost//')
"""
第一个参数用来命名当前的应用模块
第二个参数是Broker的URL地址
rabbitmq地址:amqp://user_name:password@ip/host
redis地址:redis://user_name:password@ip/host
"""
@app.task
def add(x,y):
return x+y
运行该应用模块的服务
celery -A tasks woker --loglevel=INFO
# 使用celery --help 可以查看帮助
# 使用celery worker --help 也可以
# 使用Ctrl+c就可以停止worker
tasks 就是worker要拿到任务的任务板标志,只有有个这个标志,worker才知道到底谁在发任务
这个tasks与实例化Celery的app对象对应
调用任务
可以使用delay()方法调用任务,它是apply_async()方法的快捷方式,不支持操作选项
from tasks import add
add.delay(4,4)
保存结果
若想跟踪任务的状态,Celery需要存储和发送状态到某处。比如:SQLAlchemy/Django ORM, MongoDB, Memcached, Redis, RPC (RabbitMQ)
在初始化的时候改成
app = Celery('tasks',backend='rpc://',broker='ampq://') # 存储在rabbitMQ
# app = Celery('tasks',backend='redis://',broker='ampq://') # 存储在redis
运行任务
result = add.delay(4,4)
print(result.backend) # 确认存储地
# 查看任务执行状态,True在执行中,False则是不在执行中
result.ready()
# 获取任务执行结果,超时时间为1s
result.get(timeout=1)
# propagate默认为true。当设置为false时,如果get()引发异常,此参数可以覆盖此异常。
result.get(propagate=False)
# 追踪异常
result.traceback
配置
Celery有一个输入和输出,输入连接broker,输出连接数据库
Celery的配置可以直接在app实例上进行,比如:
# 单个配置
app.conf.task_serializer = 'json'
# 多个配置
app.conf.update(
task_serializer='json',
accept_content=['json'], # Ignore other content
result_serializer='json',
timezone='Europe/Oslo',
enable_utc=True,
)
也可以将配置写入python文件(文件路径与运行的celery的app在同一路径下),使用config_from_object('文件名')来获取配置
# celery_config.py
broker_url = 'pyamqp://'
result_backend = 'rpc://'
task_serializer = 'json'
result_serializer = 'json'
accept_content = ['json']
timezone = 'Europe/Oslo'
enable_utc = True
task_routes = {
'tasks.add': 'low-priority',
}
task_annotations = {
'tasks.add': {'rate_limit': '10/m'}
}
------------------------------
app.config_from_object('celert_config')
# 可以使用python -m celeryconfig 查看语法是否正确