Celery

官方文档

Celery 官网:pkilla

Celery 官方文档英文版:http://docs.celeryproject.org/en/latest/index.html

Celery 官方文档中文版:Celery - 分布式任务队列 — Celery 3.1.7 文档

介绍

Celery是一个自带socket的框架,自身是一个独立运行的服务

启动celery服务,用来执行服务中的任务,celery服务中自带一个执行任务的对象,会执行准备就绪的任务,并将执行结果保存起来

Celery框架组成部分:

  • broker: 存放被执行任务的库, 如RabbitMQ, Redis等等
  • worker: 执行任务的对象, worker并发的运行在分布式的系统节点中。
  • backend: 存放任务结果的库, Celery支持以不同方式存储任务的结果,包括AMQP, redis等

注意: 安装的celery主体模块,默认只提供worker,要结合其他技术提供broker和backend(两个存储的单位)

Celery_第1张图片

使用

安装:

pip install celery

场景:

  • 异步任务:将耗时操作任务提交给Celery去异步执行,比如发送短信/邮件、消息推送、音视频处理等等
  • 定时任务:定时执行某件事情,比如每天数据统计
celery三种任务的使用场景 - 重点: 

url:发送邮件的接口/email/ - 发送者地址 与 发送消息 (发送的时间)
视图类:EmailAPIView - post
post逻辑:
    1)交给celery异步立即执行:拿到celery_task包中的任务(发邮件功能),调用delay就可以将任务交给celery异步执行 
    2)定时发送邮件(延迟到指定时间发送):拿到celery_task包中的任务,根据发送时间确定延迟执行的时间,调用apply_async延迟执行
    

定时任务:定时爬虫、定时更新(接口缓存更新)

任务执行模式:

  • 立即执行: delay()
  • 延迟执行: apply_async()
  • 定时执行: beat 服务端

Celery执行异步任务

基本使用:

手动添加 立即执行任务 与 延迟执行任务 Celery 立即执行任务 延迟执行任务_i0208的博客-CSDN博客_celery delay 延迟

高级使用:

自动 定时执行任务 Celery 定时任务_i0208的博客-CSDN博客

补充:

Django使用Celery时,最好将celery_task包放到项目的跟目录下

Celery_第2张图片

  • celery.py
# 在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'),
)

celery配置

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后再执行

Celery_第3张图片

参考: 一 二 三 四

其他:

from celery import group, chain, chord
# group会并行调用任务,并以列表的形式返回
# chain会把任务链接到一起,当前一个任务完成后,会将结果传递给下一个任务继续执行

celery可视化工具flower

pip install flower
python manage.py celery flower   # 默认端口 http://localhost:5555

 celery清空队列

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回调

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

你可能感兴趣的:(Celery,python)