Celery 立即执行任务 延迟执行任务

包架构封装

​
project
    ├── celery_task     # celery包
    │   ├── __init__.py # 包文件
    │   ├── celery.py   # celery连接和配置相关文件,且名字必须交celery.py
    │   └── tasks.py    # 任务体函数文件
    ├── add_task.py     # 执行任务脚本文件(这个文件可以在任意位置)
    └── get_result.py   # 获取结果

注意: 任务体代码文件要与celery.py文件在同一个包下

​

使用步骤:

app = Celery(broker=broker, backend=backend, include=include)
  1. 绑定存放任务的仓库,绑定存放任务结构的仓库,绑定任务函数文件的路径
  2. 创建Celery对象
  3. 启动celery服务

celery服务启动指令:

1. 非windows
celery worker -A celery_task -l info

2. windows:
pip3 install eventlet==0.25.1
celery worker -A celery_task -l info -P eventlet

注意: celery 5.0+ 的启动方式:
celery --app=celery_task.celery worker -f /pro/logs/celery.log -l info

注意: 执行指令时要cd到celery_task文件夹所在的父级文件夹下(也就是要找到celery_task)

案例:

  • celery_task/celery.py
from celery import Celery

# 1.绑定存放任务的仓库
broker = 'redis://127.0.0.1:6379/14'
# 2.绑定存放任务执行结果的仓库
backend = 'redis://127.0.0.1:6379/15'
# 3.绑定要执行的任务主体路径
include = ['celery_task.tasks']

# 4.实例化Celery,并添加库和任务
app = Celery(broker=broker, backend=backend, include=include)
  • celery_task/tasks.py
from .celery import app
import time, random

将app.task装饰到任务函数上 

@app.task
def add(n, m):
    res = n + m
    # 模拟不固定耗时操作
    time.sleep(random.randint(1, 5))
    return res

@app.task
def low(n, m):
    res = n - m
    # 模拟不固定耗时操作
    # time.sleep(random.randint(1, 5))
    time.sleep(2)
    return res

注意: 任务就是一个个的功能函数,功能函数的返回值就是任务的执行结果
  • add_task.py
1.手动添加 立即执行任务: delay()
调用 delay 就相当于将任务函数交给 celery 进行调用
delay 的参数与任务函数的参数保持一致
delay 返回的是任务执行结果ID号,通过此ID号拿到任务结果

from celery_task import tasks

res = tasks.add.delay(5, 2)
print(res)  # 任务执行结果ID号 : baa2fbb3-f04b-4734-bc87-397e672129fe


2.手动添加 延迟执行任务: apply_async()
调用 apply_async 就相当于将任务函数交给 celery 进行调用
apply_async 的参数与任务函数的参数保持一致
apply_async 返回的是任务执行结果ID号,通过此ID号拿到任务结果

from celery_task import task2
from datetime import datetime, timedelta

def eta_second(second):
    ctime = datetime.now()
    utc_ctime = datetime.utcfromtimestamp(ctime.timestamp())
    time_delay = timedelta(seconds=second)  # seconds: 秒
    return utc_ctime + time_delay
res = tasks.low.apply_async(args=(200, 50), eta=eta_second(10))  # 这里是延迟10秒
print(res)  # 任务执行结果ID号: 1aeb4f13-33e1-4cb4-b26d-f613ae36c68b
eta : 延迟时间(utc格式)
  • get_result.py
# 查询任务执行结果
from celery_task.celery import app

from celery.result import AsyncResult

id = 'c00be7e5-3d90-43b0-bba4-86f1140b9b8c'  # 任务ID号
if __name__ == '__main__':
    async = AsyncResult(id=id, app=app)
    if async.successful():
        result = async.get()
        print(result)  # 打印任务结果
    elif async.failed():
        print('任务失败')
    elif async.status == 'PENDING':
        print('任务等待中被执行')
    elif async.status == 'RETRY':
        print('任务异常后正在重试')
    elif async.status == 'STARTED':
        print('任务已经开始被执行')

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