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)
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)
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)
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
注意: 任务就是一个个的功能函数,功能函数的返回值就是任务的执行结果
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格式)
# 查询任务执行结果
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('任务已经开始被执行')