Celery 及异步任务处理
- 模块组成
任务模块Task:包含了异步任务和定时任务,其中异步任务通常在业务逻辑中被触发并发往任务队列.而定时任务由Celery Beat进程周期性的将任务发往任务队列.
消息中间件Broker: Broker,是为任务调度队列,接受任务生产者发来的消息,将任务存入队列,Celery本身不提供队列服务,官方推荐使用RabbitMQ 和 Redis等.
任务执行单元Worker: Worker是执行任务的处理单元,它实时监控消息队列,获取队列中调度的任务,并执行它
任务结果存储Backend: Backend用于存储任务的执行结果,以供查询,通消息中间件一样,存储也可能使用RabbitMQ,Redis和MongoDB
实现过程
1. 安装
pip install 'celery[redis]'
2.创建实例
import time from celery
import Celery
broker = 'redis://127.0.0.1:6379'
backend = 'redis://127.0.0.1:6379/0'
app = Celery('my_task', broker=broker, backend=backend)
@app.task
def add(x, y):
time.sleep(5) #模型耗时操作
return x + y
3.启动Worker
celery worker -A tasks --loglevel=info
4 . 调用任务
from tasks import add
add.delay(2,8)
5. 常规配置
broker_url = 'redis://127.0.0.1:6379/0'
broker_pool_limit = 1000 # Borker 连接池,默认是10
timezone = 'Asia/Shanghai'
accept_content = ['pickle', 'json']
task_serializer = 'pickle' result_expires = 3600 # 任务过期时间
result_backend = 'redis://127.0.0.1:6379/0'
result_serializer = 'pickle'
result_cache_max = 10000 # 任务结果最大缓存数量
worker_redirect_stdouts_level = 'INFO'