celery用于异步执行任务,定时任务等。
主要角色:
beat: 定时任务轮询。
worker:任务处理者。
broker:任务收集
backend: 结果收集
异步执行celery
构建项目
首先你得运行一个django程序:
在settings同级文件下面,创建celery.py:
import os
from celery import Celery
# 添加环境,找到django的配置文件,myproject是目录层级的名称
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')
# 创建celery
app = Celery('async_task')
# 从django配置文件里面,使用同一个配置文件,namespace会读取celery开头的。
app.config_from_object('django.conf:settings', namespace='CELERY')
同级目录下编辑 __init__ .py:
from .celery import app as celery_app
# 使用all的用法就只会对外暴露celery_app
__all__ = ['celery_app',]
在settings.py中添加,其中backend 和 broker会需要用到redis或者mq。请先安装
CELERY_TIMEZONE = TIME_ZONE
CELERY_TASK_TIME_LIMIT = 600
CELERY_RESULT_EXPIRES = 259200
# CELERY_ENABLE_UTC = False
# CELERY_TIMEZONE = TIME_ZONE
DJANGO_CELERY_BEAT_TZ_AWARE = False
# CELERY_BEAT_SCHEDULER = 'django-celery-beat.schedulers.DatabaseScheduler'
CELERY_WORKER_CONCURRENCY = 10
CELERYD_PREFETCH_MULTIPLIER = 20
CELERYD_FORCE_EXECV = True
CELERY_WORKER_MAX_TASKS_PER_CHILD = 100
CELERY_DISABLE_RATE_LIMITS = True
CELERY_BROKER_URL = 'redis://127.0.0.1:6379/2'
CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/1'
# 引入需要监控的异步任务
CELERY_IMPORTS = ("task_async.tasks",)
启动worker:
在celery目录的上一层目录去执行
celery -A app的名称 worker --loglevel=info -P eventlet (app的名称是celery文件所在目录的名称)
关闭worker
立即退出服务,不管任务是否完成。
celery multi stop w1 -A proj -l info
安全关闭works服务,会等待正在执行的任务完成后再推出workor服务。
celery multi stopwait w1 -A proj -l info
使用django创建app,名称为task_async,在app下面创建tasks.py:
import time
# Celery实例化的就是app
from app的名称 import app
@app.task()
def long_time_func():
time.sleep(10)
return 'success'
启动celery:(函数已经被监控)
如何调用?
在task_async目录下面创建taiste文件夹,在taisite文件夹下面创建taiste.py(因为tasks里面的异步任务,不要和调用代码在同一个路径下面,会发现找不到的异常)
from task_async.tasks import long_time_func
# 有参数的话直接传在delay里面
long_time_func.delay()
运行本py文件调用成功:
获取结果:
在taist目录下面创建result.py
from dasdasd import app
# taskid在调用的时候会返回,记住是用Celery对象去调用,而不是类
res = app.AsyncResult("21232187-d8d4-4d0f-ac92-d902e9c36457") # 参数为task id
print(res.result)
Celery定时任务:
主要实现可增删改查的定时任务,使用插件
'django_celery_results', 'django_celery_beat',
记得在settings里面配置。
配置好后,先迁移数据库 python manage.py migrate,生成数据表。
操作定时任务调用插件的orm
from django_celery_beat.models import PeriodicTask, IntervalSchedule, CrontabSchedule
# 创建任务时间,根据CrontabSchedule创建和相隔的 周期触发IntervalSchedele
schedule, _ = CrontabSchedule.objects.get_or_create(
minute=cron_exp["minute"],
hour=cron_exp["hour"],
day_of_week=cron_exp['day_of_week'],
day_of_month=cron_exp["day_of_month"],)
# 创建任务,更改任务的时候回去触发定时任务的修改。
PeriodicTask.objects.update_or_create(
enabled=True,
crontab=schedule,
name=task_name,
task='task_async.tasks.create_case_task',
kwargs=
json.dumps(
{
"task_name": task_name,
"case_mark": case_marks,
"proj_name": run_params["project_name"],
"case_path": case_path,
"auto_trigger_run_params": run_params,
"trigger_type": "auto"
}
)
)
最后启动beat即可:
celery -A app的名称 beat -l debug --scheduler django_celery_beat.schedulers:DatabaseScheduler