Celery 官网:pkilla
Celery 官方文档英文版:http://docs.celeryproject.org/en/latest/index.html
Celery 官方文档中文版:Celery - 分布式任务队列 — Celery 3.1.7 文档
Celery是一个自带socket的框架,自身是一个独立运行的服务
启动celery服务,用来执行服务中的任务,celery服务中自带一个执行任务的对象,会执行准备就绪的任务,并将执行结果保存起来
注意: 安装的celery主体模块,默认只提供worker,要结合其他技术提供broker和backend(两个存储的单位)
安装:
pip install celery
场景:
celery三种任务的使用场景 - 重点:
url:发送邮件的接口/email/ - 发送者地址 与 发送消息 (发送的时间)
视图类:EmailAPIView - post
post逻辑:
1)交给celery异步立即执行:拿到celery_task包中的任务(发邮件功能),调用delay就可以将任务交给celery异步执行
2)定时发送邮件(延迟到指定时间发送):拿到celery_task包中的任务,根据发送时间确定延迟执行的时间,调用apply_async延迟执行
定时任务:定时爬虫、定时更新(接口缓存更新)
任务执行模式:
基本使用:
手动添加 立即执行任务 与 延迟执行任务 Celery 立即执行任务 延迟执行任务_i0208的博客-CSDN博客_celery delay 延迟
高级使用:
自动 定时执行任务 Celery 定时任务_i0208的博客-CSDN博客
Django使用Celery时,最好将celery_task包放到项目的跟目录下
# 在celery.py中配置django环境
import os, django
# import sys
# sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "luffyapi.settings.dev")
django.setup()
from celery import Celery
broker = 'redis://127.0.0.1:6379/14' # 任务仓库
backend = 'redis://127.0.0.1:6379/15' # 结果仓库
include = ['celery_task.tasks'] # 任务们,完成需求的函数所在的文件
app = Celery(broker=broker, backend=backend, include=include)
app.config_from_object("django.conf:settings") # 去django的settings.py中读取配置信息
#让celery 自动去发现我们的任务(task)需要在app目录下 新建一个叫tasks.py(一定不要写错)文件
app.autodiscover_tasks(lambda : settings.INSTALLED_APPS)
# celery配置的另一种写法,添加到 app 的conf字典中
app.conf.update(
timezone='Asia/Shanghai', # 时区
enable_utc=False, # 是否使用UTC
# accept_content = ['application/json'],
# result_serializer = 'json',
# task_serializer = 'json'
)
app.conf.task_routes = {
'add': 'add_tasks',
'default': 'default'
}
app.conf.task_queues = (
Queue('default', routing_key='default_key'),
Queue('add_tasks', routing_key='add_tasks_key'),
)
django/settings.py
from kombu import Exchange, Queue
# celery conf
CELERY_TIMEZONE = 'Asia/Shanghai'
CELERY_ENABLE_UTC = False # 关闭时区
CELERY_ACKS_LATE=True #允许重试
CELERYD_FORCE_EXECV = True # 可以让Celery更加可靠,只有当worker执行完任务后,才会告诉redis,消息被消费,防治死锁
CELERY_DISABLE_RATE_LIMITS = True # 任务发出后,经过一段时间还未收到acknowledge , 就将任务重新交给其他worker执行
CELERYD_MAX_TASKS_PER_CHILD = 1 # 每个worker最多执行1个任务就会被销毁,可防止内存泄露
# CELERY_EVENT_QUEUE_EXPIRES = 60 队列过期时间
# CELERYD_TASK_TIME_LIMIT = 60 # 单个任务的运行时间不超过此值,否则会被SIGKILL信号杀死
# BROKER_TRANSPORT_OPTIONS = {'visibility_timeout': 90}
# 任务发出后,经过一段时间还未收到acknowledge , 就将任务重新交给其他worker执行
# 设置队列优先级
CELERYD_PREFETCH_MULTIPLIER = 1
CELERY_QUEUES = (
Queue("default", Exchange("default"), routing_key="default"),
Queue("device_add_domain", Exchange("device_add_domain"), routing_key="device_add_domain", queue_arguments={'x-max-priority': 9}) # 队列优先级数值queue_arguments最高为9
)
# 注意CELERY_ACKS_LATE,CELERYD_PREFETCH_MULTIPLIER这两个属性一定要加到配置里面,不然优先级属性不会生效
# 指定task任务使用的队列,也可以在task任务的装饰器app.task中指定任务使用的队列
#CELERY_ROUTES = {
# 'celery_task.save_db': {"queue": "default", "routing_key": "default"},
# 'celery_task.salt_ssh_state_sls': {"queue": "device_add_domain", "routing_key": "device_add_domain"}
#}
# 设置celery默认的路由
CELERY_DEFAULT_QUEUE = 'default'
CELERY_DEFAULT_EXCHANGE = 'default'
CELERY_DEFAULT_ROUTING_KEY = 'default'
test.py
@app.task(queue='default', name='celery_test') # 使用default队列 name为任务别名,默认名称为函数名
def test(x, y):
return x + y
@app.task # 默认使用 default 队列
def save_db():
pass
@app.task(queue='device_add_domain', priority=1) # 使用device_add_domain队列 priority任务等级,当队列中有其他任务时,等级高的先执行
def salt_ssh_state_sls(tgt, fun, arg):
pass
# 也可在调用tesk函数时指定队列
test.apply_async((2, 2), queue='default', countdown=10) # countdown,倒计时10后再执行
参考: 一 二 三 四
其他:
from celery import group, chain, chord
# group会并行调用任务,并以列表的形式返回
# chain会把任务链接到一起,当前一个任务完成后,会将结果传递给下一个任务继续执行
pip install flower
python manage.py celery flower # 默认端口 http://localhost:5555
celery 有密码的时候 清除任务
redis-cli -h host -p port -a password -n 11 ltrim transcode 0 196
没有密码的时候
redis-cli -n 11 ltrim transcode 0 196
-n 后面跟的是你要清除的第几个数据库
celery 取消任务
如何理解celery中的worker并发和多worker - 简书
celery的worker并发数量设置 - dos_hello_world - 博客园
Celery #3 并发 - 简书
celery并发方式 - whitesky-root - 博客园
celery 详细教程-- Worker篇_hpulfc的博客-CSDN博客_celery worker
celery多任务队列路由系统
celery 定时任务 后台守护进程 多进程任务-实战踩坑_Ch3n的博客-CSDN博客_celery multi start