Django & Celery

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yyy72999/article/details/82624600

celery是一个分布式异步框架,当我们有一个需求,比如我需要进行大批量的邮箱发送,或者博客订阅推送的时候,会造成大量的等待执行,这时候就会用到celery,

一、安装

pip install celery redis 

二、编写

#tasks.py

from celery import Celery
import time

app = Celery("task_transport", #任务名称,可随意填写
            borker="redis://127.0.0.1:6379", #任务队列,指定从哪里调度,
            backend="redis://127.0.0.1:6379" #存放结果
        )

@app.task
def add(x,y):
    time.sleep(15)
    print('function is running')
    return x + y

三、启动

celery  -A task worker -l info #task为脚本名称 worker为工作模式,info输出日志到屏幕

四、测试

#终端ipython
In [1]: import celery

In [2]: import task

In [3]: s = task.add.delay(10,20) #调用add函数的delay方法传入参数

In [4]: s
Out[4]: <AsyncResult: c3e9c1d3-310f-46cf-9956-b3b897f10b7b>

In [5]: s.get() #获取返回结果

五、项目模式

#celery_project/
    task2.py    
    celery.py   
    _pycache__ 

#celery.py

from __future__ import absolute_import,unicode_literals 
from celery import Celery 

app = Celery(
        "project",
        broker="redis://127.0.0.1:6379",
        backend="redis://127.0.0.1:6379",
        include=["task1","task2"]) #执行多个任务,这里对应的是当前目录的task1.py,task2.py

app.conf.update(
    result_expires=3600, #任务结果一小时内没有获取则过期
)
app.config_from_object('celery_app.celeryconfig') #通过Celery实例加载配置模块

if __name__ == '__main__':
    app.start()

#task1.py & task2.py

from __future__ import absolute_import,unicode_literals 
from .celery import app 

@app.task
def add(x,y):
    return x + y 

@app.task
def delete(x,y):
    return x - y 

#执行
celery -A celery_project worker -l info //celery_project为目录名称

#测试方法一样,开启另外一个终端调用task1或task2.py中的函数

celery常用方法

result = task.add.delay(10,20)  //调用函数和delay方法

result.get() //获取结果,timeout默认为0

result.ready() //如果函数执行出现阻塞则返回False,可进行判断!

result.get(propagate=False) // 如果出错,获取错误结果,不触发异常

result.traceback //打印异常详细结果

result.id //任务id

celery multi start name  project_name -l info //启动celery任务并后台运行

celery multi restart worker -A  celery_project //重新启动celery任务

celery multi stop worker //停止

Celery定时任务

#task1.py

from __future__ import absolute_import,unicode_literals
from .celery import app //从主程序倒入
from celery.schedules import crontab

@app.on_after_configure.connect
def setup_periodic_tasks(sender,**kwargs):

    #请注意,这里的name不能相同!必须唯一,否则执行该方法!
    sender.add_periodic_task(5.0,delete.s(10,20),name="add every 10") //每五秒
    sender.add_periodic_task(5.0,add.s(2,20),name="add every 10")

    sender.add_periodic_task(
            crontab(hour=20,minute=15), //每天2015
            add.s(200,5)
        )

@app.task
def add(x,y):
    return x + y

@app.task
def delete(x,y):
    return x - y 

#启动worker
celery -A celery_project worker -l debug 

#启动beat
celery -A celery_project.task1 beat -l debug 

基于配置文件方式定义执行任务

app.conf.beat_schedule = {
    'add-every-30-seconds' : {
        'task': 'celery_project.task1.add',
        'schedule': 5.0,
        'args': (100,200)
    }
}

app.conf.timezone = 'UTC'

Django & Celery

pip install django-celery  //安装django-celery

#需要和settings.py同级创建celery.py
#settings.py
INSTALL_APP -> djcelery //INSTALL_APP下加入djcelery

import djcelery

djcelery.setup_loader()

BROKER_URL = 'redis://127.0.0.1:6379' #队列地址

CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379' #存储结果

CELERY_TASK_SERIALIZER = 'json'

CELERY_RESULT_SERIALIZER = 'json'

CELERY_ACCEPT_CONTENT = ['json']

CELERY_IMPORTS = ('api.tasks', )

CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler' #是使用了django-celery默认的数据库调度模型,任务执行周期都被存在你指定的orm数据库中

CELERYD_CONCURRENCY = 20 #worker并发数

CELERY_TASK_RESULT_EXPIRES = 1200 #任务结果过期时间

CELERYD_PREFETCH_MULTIPLIER = 4 # celery worker 每次去redis取任务的数量

CELERYD_MAX_TASKS_PER_CHILD = 200 # 每个worker执行了多少任务就会死掉,我建议数量可以大一些,比如200

#celery.py -> 与settings.py同级

from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
from django.conf import settings

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Celery_Project.settings') 

app = Celery('Celery_Project')

app.config_from_object('django.conf:settings')

app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

#__init__.py

from __future__ import absolute_import, unicode_literals
from .celery import app as celery_app

#{app_name}/tasks.py 可以在每一个app下创建tasks.py文件进行celery任务编写

from __future__ import absolute_import, unicode_literals
from celery import shared_task

@shared_task
def add(x, y):
    return x + y

#start
python manage.py migrate djcelery //生成数据表

python manage.py runserver  //启动django

python manage.py  celery worker -c 6 -l debug //启动celery

猜你喜欢

转载自blog.csdn.net/yyy72999/article/details/82624600