万物不为我所有,但为我所用|

注入灵魂

园龄:3年7个月粉丝:3关注:2

2021-08-30 18:59阅读: 80评论: 2推荐: 0

Celery入门

Celery是一个可以处理大量消息的分布式系统,是一个关注于实时进程的任务队列,同时也支持任务时间表。

Celery经由消息进行交流,经常使用一个broker在client和worker之间调解。初始化一个任务,client添加一个消息到队列中,broker将消息传递给worker。

选择Broker

Broker:消息枢纽

常用的有两种:

  1. RabbitMQ
  2. 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 查看语法是否正确

本文作者:注入灵魂

本文链接:https://www.cnblogs.com/totopian/p/15207365.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   注入灵魂  阅读(80)  评论(2编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起
  1. 1 尚好的青春 孙燕姿
尚好的青春 - 孙燕姿
00:00 / 00:00
An audio error has occurred.