自动化运维之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是报错:1555380425495

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为项目名称):

1555386377653

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:

posted @ 2019-06-02 22:00  海予心  阅读(273)  评论(0编辑  收藏  举报