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

posted @ 2021-08-30 18:59  注入灵魂  阅读(99)  评论(2)    收藏  举报