自动化运维之celery
1、celery
step1 celery定义task
from celery import Celery
c=Celery("task",broker="redis://192.168.182.130:6380/1)#broker可以是redis和rabbitmq
@c.task
def myfunc1():
return "myfunc1"
@c.task
def myfunc2():
return "myfunc2"
@c.task
def myfunc3():
return "myfunc3"
step2 windows安装celery脚手架eventlet(原因是celery4.0后不支持windows,linux不用安装)
否则运行celery是报错:
step3 创建文件s2执行celery的task函数:
from s1 import myfunc1,myfunc2,myfunc3
s=myfun1.delay()
celery可以启动多个,被监控的文件修改后一定要重启
**step4 运行celery **
celery worker -A s1 -l info -P eventlet 用-l info指定日志级别 -A表示执行时监控的文件
step 5 获取返回值:
s1中增加backend参数
c=Celery("task",broker="redis://192.168.182.130:6380/1 backend="redis://192.168.182.130:6380/2)#broker、backend可以是redis和rabbitmq
s2中获取
form celery import AsyncResult
AsyncResult(id="函数执行返回的hash值",app=c)c为Celery()实例化的对象
# 获取s的id
print(s.id)
r=AsyncResult(id=s.id,app=c)
print(r.get())
step6 task函数增加参数:
#s1中:
@c.task
def myfun1(a,b):
time.sleep(20)
return f"myfun1--{a}--{b}"
#s2中:
s=myfun1.delay(10,30)
step7 测试阻塞对效率的影响或显示全部错误信息:
s1的task函数加time.sleep制造阻塞或int('d')制造错误
#s2中增加:
# 只获取报错信息
print(r.get(propagate=False))
#获取源文件的报错信息内容
print(r.traceback)
获取执行状态
print(r.successful())
print(r.status)
propagate参数隐藏当前文件的报错提示,只显示报错信息
traceback获取原文件的报错信息
2、celery的延时任务
s1中不做改变
s2中有三种延时方式:
from s1 import myfun1
#当前时间后多长时间去执行
# s=myfun1.apply_async((10,30),countdown=5,)
# s=myfun1.apply_async((10,30),countdown=datetime.timedelta(),)
# 一定要是utc的时间
s=myfun1.apply_async((10,30),eta=5,)
支持的参数 :
countdown : 等待一段时间再执行.
add.apply_async((2,3), countdown=5)
eta : 定义任务的开始时间.这里的时间是UTC时间,这里有坑
add.apply_async((2,3), eta=now+tiedelta(second=10))
expires : 设置超时时间.
add.apply_async((2,3), expires=60)
retry : 定时如果任务失败后, 是否重试.
add.apply_async((2,3), retry=False)
retry_policy : 重试策略.
max_retries : 最大重试次数, 默认为 3 次.
interval_start : 重试等待的时间间隔秒数, 默认为 0 , 表示直接重试不等待.
interval_step : 每次重试让重试间隔增加的秒数, 可以是数字或浮点数, 默认为 0.2
interval_max : 重试间隔最大的秒数, 即 通过 interval_step 增大到多少秒之后, 就不在增加了, 可以是数字或者浮点数, 默认为 0.2
countdown设置延迟的秒数
3、celery 执行周期任务
#定义定时task方式一:
from c import task
task.conf.beat_schedule={
timezone='Asia/Shanghai',
"each10s_task":{
"task":"c.add",
"schedule":3, # 每3秒钟执行一次
"args":(10,10)
},
}
#定义定时task方式二:
from celery.schedules(beat??) import crontab
task.conf.beat_schedule={
timezone='Asia/Shanghai',
"each3m_task":{
"task":"c.add",
"schedule":crontab(minute=3), #每小时的第3分钟执行
"args":(10,10)
},
"each3m_task":{
"task":"c.add",
"schedule":crontab(minute=*/3), #每小时的第3分钟执行
"args":(10,10)
},
}
启动:celery beat -A filename --detach -l info -f beat.log
4、celery在django中的执行异步任务
1.执行异步任务
1.1 在生成的目录文件中添加celery文件,内容如下
注意启动redis,redis有密码的情况下backend='redis://:密码@10.211.55.19/3'的格式
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'tests.settings') #与项目关联
app = Celery('tests',backend='redis://10.211.55.19/3',broker='redis://10.211.55.19/4')
#创建celery对象
# Using a string here means the worker doesn't have to serialize
# the configuration object to child processes.
# - namespace='CELERY' means all celery-related configuration keys
# should have a `CELERY_` prefix.
app.config_from_object('django.conf:settings', namespace='CELERY')
#在django中创建celery的命名空间
# Load task modules from all registered Django app configs.
app.autodiscover_tasks()
#自动加载任务
1.2编辑settings.py同级目录的init.py
from __future__ import absolute_import, unicode_literals
from .celery import app as celery_app
__all__ = ['celery_app']
1.3 在项目中添加tasks文件,用来保存tasks的文件
from celery import shared_task
@shared_task
def add(x, y):
return x + y
@shared_task
def mul(x, y):
return x * y
@shared_task
def xsum(numbers):
return sum(numbers)
1.4添加views文件内容
from .tasks import add
def index(request):
result = add.delay(2, 3)
return HttpResponse('返回数据{}'.format(result.get()))
1.5 启动worker
celery -A tests worker -l info
windows中(mydjango_celery为项目名称):
1.6添加url并调用
5、celery与django结合执行定时任务
2.1需要安装一个django的组件来完成这个事情
pip install django-celery-beat
2.2将django-celery-beat添加到INSTALLED_APPS里面
INSTALLED_APPS = (
...,
'django_celery_beat',
)
2.3刷新到数据库
python3 manage.py makemigrations #不执行这个会有问题
python3 manage.py migrate
2.4 admin配置
python manage.py migate
crontab表:admin中穿件定时任务
intervals:可设置延时
Periodic tasks:
2.5启动beat(在项目目录下??)
celery -A tests beat -l info --scheduler django_celery_beat.schedulers:DatabaseScheduler
2.6 启动worker
celery -A tests worker -l info
辅记:设置完后重启celery: