celery

celery学习记录

1.celery介绍
Celery 是一个专注于实时处理和任务调度的分布式任务队列, 同时提供操作和维护分布式系统所需的工具.. 所谓任务就是消息, 消息中的有效载荷中包含要执行任务需要的全部数据.

Celery 是一个分布式队列的管理工具, 可以用 Celery 提供的接口快速实现并管理一个分布式的任务队列.

Celery 本身不是任务队列, 是管理分布式任务队列的工具. 它封装了操作常见任务队列的各种操作, 我们使用它可以快速进行任务队列的使用与管理.

Celery 特性 :

方便查看定时任务的执行情况, 如 是否成功, 当前状态, 执行任务花费的时间等.

使用功能齐备的管理后台或命令行添加,更新,删除任务.

方便把任务和配置管理相关联.

可选 多进程, Eventlet 和 Gevent 三种模型并发执行.

提供错误处理机制.

提供多种任务原语, 方便实现任务分组,拆分,和调用链.

支持多种消息代理和存储后端.

Celery 是语言无关的.它提供了python 等常见语言的接口支持.
2.开发项目目录结构
├── proj
│--------├── celery.py
│--------├── __init__.py
│--------├── task.py
└── test.py
3.简说

broker 使用rabbit-MQ

使用redis存储任务执行结果

#celery.py

from __future__ import absolute_import, unicode_literals
from celery import Celery

app = Celery('test',
             broker='amqp://admin:admin@[ip]:5672/%2f',
             backend='redis://:root123456@[ip]:6379/10',
             include=['proj.task'])


app.conf.update(
    result_expires=3600,
    worker_max_tasks_per_child=40
)

if __name__ == '__main__':
    app.start()

任务

# task.py
from __future__ import absolute_import, unicode_literals

import time

from .celery import app


@app.task
def add(x, y):
    print("任务开始。。。")
    for i in range(x + y):
        time.sleep(3)
        print(f"------{i}-----")

测试文件

from proj.task import add

# 执行任务
a = add.delay(2, 20)
4.简单介绍几种应用场景
# 查询任务状态
from celery.result import AsyncResult
task = AsyncResult("2befdc07-7b60-4c79-99b3-b8720a797e36")
status = task.status
print(status)
# 手动结束定时任务

from celery.app.control import Control
from proj.celery import app
task_id = "110d010b-7ce3-4a81-a352-c85dbbe31630"
celery_control = Control(app=app)
celery_control.revoke(task_id, terminate=True)
#定时任务

from datetime import datetime
from datetime import timedelta

# 获取当前时间
ctime = datetime.now()
# 默认用utc时间,把当前时间转utc时间
utc_time = datetime.utcfromtimestamp(ctime.timestamp())

# 这段意思是取十秒之后的时间对象,因为时间对象只能和时间对象相加  seconds(秒)  minutes(分钟), hours(小时), weeks(周)
time_delay = timedelta(seconds=10)
# 最终的时间对象为当前时间后十秒
task_time = utc_time + time_delay
print('最终执行时间', task_time)
# 使用apply_async并设定时间
result = add.apply_async(args=[4, 3], eta=task_time)
print(result.id)
from datetime import datetime

# 拼接得到执行任务的时间,得到的就是一个时间对象
v1 = datetime(2022, 2, 28, 19, 18, 00)
print('执行任务时间:', v1)
# 转化成utc时间
v2 = datetime.utcfromtimestamp(v1.timestamp())
print('执行任务的utc时间:', v2)
# 执行定时任务,调用apply_async,args是要传入的参数,eta是执行的时间
result = add.apply_async(args=[1, 3], eta=v2)
print(result.id)
5.多线程启动
celery -A proj worker -l info -c 5

周期任务。。。。

posted @ 2022-03-04 09:02  小辉的  阅读(306)  评论(0编辑  收藏  举报
/*小图标*/